目录
一、MongoDB认识
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。
推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。
二、语法
1.数据库操作
操作 | 语法 | 备注 |
选择和创建数据库 | use 数据库名 | 如果数据库不存在,会自动创建,但是要存入数据时才会显示,此时是存放在内存中的,存入数据才会写入磁盘 |
查看有权查看的所有数据库 | show dbs 或者 show databases | |
查看当前使用的数据库 | db | |
删除数据库 | db.dropDatabse() | db为当前数据库,删除当前数据库 |
2.集合操作
操作 | 语法 | 备注 |
创建集合 | db.createCollection(集合名) | createCollection为显式创建,即创建后即使集合为空也会显示。 隐式创建则为在插入一条文档时,若集合不存在则会自动创建。 |
删除集合 | db.集合名.drop() | |
查看所有集合 | show collections |
3.文档操作
1>.插入
操作 | 语法 | 备注 |
单行插入 | db.集合名.insert({key:value}) | 这里的集合可以不存在,会自动隐式创建 |
多行插入 | db.集合名.insertMany([{key1:value1},{key2:value2}]) | 这里的集合可以不存在,会自动隐式创建 |
2>.查询
操作 | 语法 | 备注 |
基本查询 | ||
查询集合中所有文档 | db.集合名.find() | |
投影查询 | ||
查询所有数据的特定属性 | db.集合名.find({},{属性1:1}) | 查看所有文档的属性1(附带_id属性) :0不显示(针对_id) |
查询特定数据的特定属性 | db.集合名.find({name:"小明",{属性1:1}}) | 查询name为小明的的属性1 |
统计查询 | ||
统计所有记录数 | db.集合名.count() | |
统计符合条件记录数 | db.集合名.count({name:"小明"}) | 统计name为小明的所有记录数 |
分页查询 | ||
查询第一页 | db.集合名.find().limit(4) | limit(n)查询前n跳数据,此时为前四条 find()中也可以写入查询条件 |
查询第n页 | db.集合名.find().limit(4).skip(n-1 * 4) | skip(n)跳过前n条数据 |
排序查询 | ||
默认以_id升序排列 | db.集合名.find().sort() | |
按条件升序 | db.集合名.find().sort({age : 1}) | 以age升序排列 :1 升序 :-1 降序 |
正则查询(模糊查询) | ||
db.集合名.find({name : "\ 刘 \"}) | 查询name中所有包含刘的数据记录 支持所有正则表达式 | |
比较查询 | ||
大于 $gt | db.集合名.find({age: {$gt : NumberInt(18) } }) | 查询所有age > 18的数据记录 |
小于 $lt | db.集合名.find({age: {$lt : NumberInt(18) } }) | 查询所有age < 18的数据记录 |
大于等于 $gte, 小于等于$lte,不等于$ne 格式与上面两条记录的格式一样 find( {字段 : {$... : NumberInt(n)} } ) | ||
包含查询 | ||
包含 $in | db.集合名.find({字段: {$in : [a, b] } }) | 查询字段为a或字段为b的数据记录 |
不包含 $nin | db.集合名.find({字段: {$nin : [a, b] } }) | 查询字段不为a或字段不为b的数据记录 |
单条件查询 | ||
查询集合中所有符合条件的文档 | db.集合名.find({age:18}) | 根据条件查询,这里查询age是18的文档数据 |
查询集合中第一条符合条件的文档 | db.集合名.findOne({sex:女}) | |
多条件查询 | ||
$and | db.集合名.find( {$and : [{条件1}, {条件2}] } ) | 查询符合条件1 和 条件2的数据记录 |
$or | db.集合名.find( {$or : [{条件1}, {条件2}] } ) | 查询符合条件1 或 条件2的数据记录 |
3>.更新
操作 | 语法 | 备注 |
覆盖修改 | db.集合名.update({name:"小明"},{age:NumberInt(22)} ) | 会将name为小明的这一整条数据替换为 age:22 在插入整数时,要使用函数NumberInt(value),因为单纯写一个数字MongoDB会认为是浮点型 |
局部修改 | db.集合名.update({name:"小明"},{$set:{age:NumberInt(22)}}) | {$set: {update}},只会将name为小明的这一整条数据中的age属性改为22 |
上述修改,都是默认修改找到的第一条符合的数据 | ||
批量更新 | db.集合名.update({age:18},{$set:{sex: "女"}}, {multi:true}) | 再加上参数{multi:true},可以将所有age为18数据中的sex都修改为女 |
列值增长修改 | db.集合名.update({name:"小明"},{$inc:{age:NumberInt(1) }}) | {$inc: {age:NumberInt(1)}},将name为小明的数据中的age增加1(自定义增加数量) |
4.>删除
操作 | 语法 | 备注 |
选择多条删除 | db.集合名.remove({name:"小明"}) | 删除全部name为小明的数据 |
删除全部 | db.集合名.remove({}) | 删除所有数据 |
删除多条数据 | db.集合名.deleteMany({query}) | |
删除一条数据 | db.集合名.deleteOne({query}) | |
4.Index索引
索引会增强查询效率
1>.索引查看
操作 | 语法 | 备注 |
查看所有索引 | db.集合名.getIndexes() | v:内置版本号 key: 该索引对应的键 : 1(升序) /-1(降序) name : 索引名 ns : 存放在哪个空间 |
2>.创建索引
操作 | 语法 | 备注 |
创建索引 | db.集合名.createIndex(keys,option) | keys: 要为哪些键创建索引,可以使多个 格式 {key1 : 1, key2 : -1} option: 传入的参数,我们作为基础使用,不需要填写 |
3>.删除索引
操作 | 语法 | 备注 |
删除指定索引 | db.集合名.dropIndex(索引名) 或者 db.集合名.dropIndex(索引的创建规则) | keys: 要为哪些键创建索引,可以使多个 格式 {key1 : 1, key2 : -1} option: 传入的参数,我们作为基础使用,不需要填写 |
删除所有索引 | db.集合名.dropIndexes() | _id的索引不会被删除 |
4>. 执行计划
db.集合.find({},{name:1,age:1}).explain() 投影查询
作用 查看索引是否被引用,
fetch(抓取):被引用
collscan(集合扫描):未被引用
5>. 涵盖查询
投影查询的刚好是有索引的字段,效率会非常高
三、总结
"掌握MongoDB的基本操作是迈向高效数据管理的第一步。勇敢尝试,并不断实践,掌握更多的技巧和知识,才能真正发挥MongoDB的全部潜力。期待在你的项目中看到这些操作的精彩应用,加油!"