前言
MongoDB属于Nosql的一种
Nosql的概念
互联网的早期我们的数据大多以关系型数据库来存储的。其特点是规范的数据结构(预定义模式)、强一至性、表与表之间通过外键进行关联,这些特征使我们对数据的管理更加清晰和严谨,但随着互联网的发展数据成爆炸式的增长我们对数据库需要更好的灵活性和更快的速度。这就是NoSql可以做到的。它不需要预先定义模式,没有主外键关联、支持分片、支持复本。
NoSql的分类
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。
列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。
NoSql的应用场景
1、数据模型比较简单;
2、需要灵活性更强的IT系统;
3、对数据库性能要求较高;
4、不需要高度的数据一致性;
MongoDb的体系结构
逻辑结构与关系数据库的对比:
关系型数据库 | MongoDb |
---|---|
database(数据库) | database(数据库) |
table (表) | collection( 集合) |
row( 行) | document( BSON 文档) |
column (列) | field (字段) |
index(唯一索引、主键索引) | index (全文索引) |
join (主外键关联) | embedded Document (嵌套文档) |
primary key(指定1至N个列做主键) | primary key (指定_id field做为主键) |
aggreation(groupy) | aggreation (pipeline mapReduce) |
MongoDb安装配置与基础命令
下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.5.tgz
解压
tar -zxvf mongodb-linux-x86_64-4.0.5.tgz
创建数据库目录
mkdir -p /data/mongo
启动mongo
./bin/mongod --dbpath=/data/mongo/
常规参数
参数 | 说明 |
---|---|
dbpath | 数据库目录,默认/data/db |
bind_ip | 监听IP地址,默认全部可以访问 |
port | 监听的端口,默认27017 |
logpath | 日志路径 |
logappend | 是否追加日志 |
auth | 是开启用户密码登陆 |
fork | 是否已后台启动的方式登陆 |
config | 指定配置文件 |
以配置文件方式启动命令如下
./bin/mongod -f mongo.conf
启动客户端 连接 本机的地的默认端口
./bin/mongo
指定IP和端口
./bin/mongo --host=127.0.0.1 --port=27017
数据库与集合的基础操作
命令 | 说明 |
---|---|
show dbs; | 查看数据库 |
use test | 切换数据库 |
db.friend.insertOne({name:"张三",sex:"man"}); | 创建数据库与集合,在插入数据时会自动 创建数据库与集和 |
show tables或者 show collections; | 查看集合 |
db.friend.drop(); | 删除集合 |
db.dropDatabase() | 删除数据库 |
MongoDB CRUD与全文索引
插入
- 数据库的新增不需要事先设计模型结构,插入数据时会自动创建。
- 同一个集合中不同数据字段结构可以不一样
插入单条
db.friend.insertOne({name:"张三",sex:"man"});
插入多条
db.friend.insertMany([
{name:"张三",sex:"man"},{name:"李四",sex:"woman",age:18,birthday:new Date("1995-11-02")},{name:"王麻子",sex:"woman"}
]);
查询
a. 基于条件的基础查询
b. or、gt、lt、$lte 运算符
c. 基于 sort skip limit 方法实现排序与分页
d. 嵌套查询
e. 数组查询
f. 数组嵌套查询
基于ID查找
db.emp.find({_id:1101}
基于属性查找
db.emp.find({"name":"张三"})
&& 运算 与大于 运算
db.emp.find({"job":"java开发","salary":{$gt:8000}})
in 运算
db.emp.find({"job":{$in:["研发体系","研发中心"]}}
or 运算
db.emp.find({$or:[{job:"java开发" },{job:"研发中心"}] })
排序与分页
格式:sort skip limit
db.emp.find().sort({dep:1,salary:-1}).skip(5).limit(2)
修改
设置值
db.emp.update({_id:1101} ,{ $set:{salary:10300} })
基于条件 更新多条数据
db.emp.updateMany({"dep":"研发中心"},{$inc:{salary:100}})
索引
索引的创建
db.project.createIndex({name:"text",description:"text"}
基于索引分词进行查询
db.project.find({$text:{$search:"java jquery"}})
基于索引 短语
db.project.find({$text:{$search:"\"Apache ZooKeeper\""}})
查看执行计划
db.project.find({$text:{$search:"java -阿里"}}).explain("executionStats")