MongoDB
一、MongoDB 的文档操作
在 MongoDB 中文档是指多个键及其关联的值有序地放置在一起就是文档,其实指的就是数据。MongoDB 中的文档数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式。BOSN是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
1、更新操作
语法格式:
db.集合名称.updata({查找条件},{"$set":{更新内容}},multi,upset)
注:update默认只更新符合条件的第一条数据。
multi:是否多行数据更新,默认false
upsert:如果没有符合条件的数据,是否添加数据,默认false,新增数据为:条件+更新内容
案例:
db.coll.update({"sex":"boy"},{"$set":{"name":"xiaohua","age":13}},true,true)
-
$inc自增加(性别为男的人年龄加2)
db.coll.update({"sex":"boy"},{"$inc":{"age":2}})
-
$unset删除字段(指删除 age 字段,age 对应 value 可随便填)
db.coll.update({"sex":"boy"},{"$unset":{"age":2}})
-
$push向字段里加数据(性别为男的人,学习课程数组中增加 python 课)
db.coll.update({"sex":"boy"},{"$push":{"class":"python"}})
注:向文档的某个数组类型的键添加一个数组元素,不过滤重复数据。
-
$pop删除字段里数据(不可指定)
db.coll.update({"sex":"boy"},{"$pop":{"class":1}})
注:删除数据元素。可取值1或-1,1表示删除尾部第一个数据,-1表示删除头部第一个数据。
-
$pull删除字段里数据(可指定)
db.coll.update({"sex":"boy"},{"$pull":{"class":"java"}})
-
$pullAll删除字段中多个数据
db.coll.update({"sex":"boy"},{"$pullAll":{"class":["c","php"]}})
-
$rename修改字段名称(将"sex"改为"sexs",value值不变,依旧是 boy)
db.coll.update({"sex":"boy"},{"$rename":{"sex":"sexs"}})
注:rename 是将原字段删除,添加新的字段
2、等值条件查询
-
条件操作符
$gt:大于(查询年龄大于13的数据)
db.coll.find({"age":{"$gt":13}})
$gte:大于等于
db.coll.find({"age":{"$gte":13}})
$lt:小于
db.coll.find({"age":{"$lt":13}})
$lte:小于等于
db.coll.find({"age":{"$lte":13}})
$eq:等于
db.coll.find({"age":{"$eq":13}})
$in:包含(查询年龄为13或25)
db.one.find({"age":{"$in":[13,25]}})
$nin:不包含(查询年龄不是13和25)
db.one.find({"age":{"$nin":[13,25]}})
-
逻辑操作符
$and:和(查询年龄大于13并且小于40)
db.coll.find({"$and":[{"age":{"$gt":13}},{"age":{"$lt":40}}]})
$or:或(查询年龄小于13或者大于40)
db.coll.find({"$or":[{"age":{"$lt":13}},{"age":{"$gt":40}}]})
-
类型操作符
$type:检索集合中匹配的数据类型
db.coll.find({"age":{"$type":"string"}})
3、投影查询
-
查询指定字段(查询年龄大于13的人的名字)
db.coll.find({"age":{"$gt":13}},{"name":1})
注:1为真,代表查询本字段;0为假,代表查询除了本字段的其他字段。1 与 0 不能同时出现,如
db.coll.find({"age":{"$gt":13}},{"name":1,"age":0})
为错误。
4、排序、分页查询
-
sort(查询年龄大于12,并且按年龄升序排序)
db.coll.find({"age":{"$gt":12}}).sort({"age":1})
-
skip(查询年龄大于12,按升序排列后,跳过第一条数据,查询后边的数据)
db.coll.find({"age":{"$gt":12}}).sort({"age":1}).skip(1)
-
limit(查询年龄大于12,按升序排列后的前两条数据)
db.coll.find({"age":{"$gt":12}}).sort({"age":1}).limit(2)
5、聚合查询
-
求总数
db.coll.aggregate([{"$group":{"_id":"$name","count":{"$sum":"$age"}}}])
注:计算数据中age的数据总和,count 为别名,引用 age 时,前边必须加 $ 符号。
-
group前加match(相当于where)
db.coll.aggregate([
{"$match":{"age":{"$gt":13}}},
{"$group":{"_id":"$name","count":{"$sum":"$age"}}}
])
注:通过name分组,计算age总和,查找条件为大于13的人
运行结果:
-
group后写match(相当与having)
db.coll.aggregate([ {"$match":{"age":{"$gt":13}}}, {"$group":{"_id":"$name","count":{"$sum":"$age"}}}, {"$match":{"count":{"$gt":15}}} ])
注:通过name分组,计算age总和,查找条件为大于13的人,并且count大于15
运行结果:
-
最大$max(查询年龄中最大值)
db.coll.aggregate([{"$group":{"_id":null,"count":{"$max":"$age"}}}])
-
最小$min(查询年龄中最小值)
db.coll.aggregate([{"$group":{"_id":null,"count":{"$min":"$age"}}}])
-
平均值$avg(查询年龄中平均值)
db.coll.aggregate([{"$group":{"_id":null,"count":{"$avg":"$age"}}}])
-
统计结果返回数组$push
db.coll.aggregate([{"$group":{"_id":"$name","all_age":{"$push":"$age"}}}])
注:将名字相同的人的年龄放在同一个数组中
-
$unwind 将数组拆分
db.coll.aggregate([{"$unwind":"$class"}])
-
案例:查找选修Python课程的人,并将其名字放到一个数组中
db.one.aggregate([ {"$unwind":"$class"}, {"$match":{"class":"python"}}, {"$group":{"_id":null,"all_name":{"$push":"$name"}}} ])
1)拆分课程数组
2)查找课程为 python 的人的信息
3)将名字放入同一个数组中
-
deleteOne\deleteMany 删除
db.one.deleteOne({"name":"lisa"})
二、索引
索引可以提高查询效率,如果没有索引,MongoDB 在读数据是必须扫描集合中每个文件并选取那些符合查询条件的记录。因为是扫描全集合,而且如果处理的是大量数据,查询可能会花费很长时间,所以对系统性能要求非常高。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,是对数据库表中一列或者多列的值有序排序的一种结构。
1、创建索引
-
基本语法
db.coll.createIndex({"name":1})
db.coll.ensureIndex({"name":1})
注:两种方法都可以,name 为创建索引的字段;1 (正数)为升序排序,-1 (负数)为降序排序,0 报错。
-
查看创建的索引
db.coll.getIndexes();
-
为索引添加条件
db.coll.createIndex({"name":1},{"background":true,"name":"index_one"})
参数 数据类型 默认值 功能 background Boolean false 后台创建索引,以便创建索引是不阻止其他数据活动 unique Boolean false 创建唯一索引 name String 指定索引名称,MongoDB自动指定的名称为索引字段名称和排序顺序串联 sparse Boolean false 对文档中的不存在的字段数据不启用索引 expireAfterSeconds Integer 指定索引过期时间(消耗大量内存) partialFilterExpression document 如果指定MongoDB指挥满足过滤表达式的记录
2、查看索引
-
查看索引全部信息
db.coll.getIndexes()
-
查看索引键
db.coll.getIndexKeys()
-
查看索引大小
db.coll.totalIndexSize()
-
删除所有的自建索引
db.coll.dropIndexes()
3、索引的其它属性
-
唯一索引
唯一索引保证索引对应的键不会出现相同的值,比如 id 就是唯一索引
db.coll.createIndex({"name":1},{"background":true,"unique":true})
-
部分索引
部分索引就是带有过滤条件的索引
db.coll.createIndex({"name":1},{"partialFilterExpression":{"age":{"$gt":"5"}}})
-
稀疏索引
稀疏索引仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的任何文档。索引是”稀疏的“,因为它不仅包含集合的所有文档。相反,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
db.coll.createIndex({"name":1},{"sparse":true})
4、重建索引
-
使用reIndex()函数重建索引。重建索引可以减少索引存储空间,减少索引碎片,优化索引查询效率。一般在数据量大量变化后,会使用重建索引来提升索引性能。重建索引是删除原索引重新创建的过程。
db.coll.reIndex()