input-查询过滤-清洗去重-聚合分组-output
MomgoDB条件查询
添加测试数据
db.users.insert({name:‘kiki’,age:18,city:‘BJ’})
db.users.insert({name:‘jiji’,age:16,city:‘ZZ’})
db.users.insert({name:‘lili’,age:17,city:‘KK’})
db.users.insert({name:‘bibi’,age:25,tags:[“java”,“python”],city:“CQ”})
db.users.save()
db.users.insertOne()
db.users.insertMany()
MongoDB查询与SQL对应关系
在MongoDB中叫方法而不是叫函数
MongoDB查询运算符
MongoDB数据查询、条件查询、过滤
db.users.find()
db.users.find({})
db.users.find({age:18})
db.users.find({age:{$gt:18})
db.users.find({age:{$it:18}})
db.users.find({age:{$ite:18}})
db.users.find({age:{$in:[18,19]}})
db.users.find({$or:[{age:18},name:'jiji']})
db.users.find({name:/.*i.*/})
db.users.find({name:null})
db.users.find({age:${$exists:false}})
MongoDB条件查询
大于:db.uses.find({age:{$gt:18}})
大于:db.uses.find({age:{$lt:18}})
数组:db.uses.find({age:{$in:[11,12,13]}})
排序:db.uses.find().sort(age:1)
投影:db.uses.find({age:{$lt:18}},{name:1,age:0})
MongoDB数据查询数组条件
精确匹配数组元素:db.uses.find({tags:["java","nosql"]})
无顺序and精确匹配:db.uses.find({tags:{$all:["java","nosql"]}})
至少匹配一个:db.uses.find({tags:"java"})
组合条件满足一个条件过滤:db.users.find({age:{$gt:15,$it:20}})
组合条件同时满足条件过滤:
db.users.find({age:{$elemMatch:{$gt:22,$it:30}}})
db.users.find({}) 最多可以显示20条数据,如果想要看更多可以输入it
db.users.find({name:/.*i.*/}) 包含i的
db.users.find({name:/^i.*/}) i开头的
db.users.find({name:/.*i$/}) i结尾的
MongoDB嵌套数组文档条件查询
db.orders.insert([
{name:“kiki”,items:[{title:“mongodb”,count:1},{title:“java”,count:3}]},
{name:“jiji”,items:[{title:“iphone”,count:12},{title:“java”,count:7}]},
{name:“mimi”,items:[{title:“R”,count:5},{title:“python”,count:2}]}
]);
db.orders.find({“items.title”:“java”})
紧缺匹配:db.orders.find({“items”:{title:‘java’,count:3}})
or匹配:db.orders.find({KaTeX parse error: Expected 'EOF', got '}' at position 42: …items.count:1}]}̲) 任意元素满足条件:db.o…gt:3}’})
第0个元素满足条件的:db.orders.find({‘items.0.count’:{KaTeX parse error: Expected 'EOF', got '}' at position 5: gt:2}̲}) 多条件and查询:db.…gt:3,$it:100}"})
db.users.find({address:{country:china,city:CQ}})
db.users.find({“address.city”:“CQ”}})
db.users.find({age:18,“address.city”:“CQ”}})
db.users.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:18}̲,"address.city"…it:170}}})
db.users.find({“style.weight”:{$gt:50}}})
映射Project与过滤
MongoDB数据查询结果投影:只是结果字段的重新抽取
返回特定字段:
db.users.find({age:18},{name:1,age:1}) 等于18岁的返回name和age
db.users.find({age:{$gt:18}},{name:1,age:1}) 大于18岁的返回name和age
排除字段:
db.users.find({age:{$gt:18}},{name:0}) 大于18岁的不返回name
文档字段的抽取,1抽取 0排除
MongoDB去重Distinct
查询所有数据去重
db.users.distinct("name")
db.users.distinct("item.count")
条件查询数据后去重
db.users.distinct("name",{age:18})
db.users.distinct("item.count",{age:{$gt:18}})
等价命令:db.runCommand({distinct:"orders",key:"name"})
为了性能,尽力使用索引
支持选择语言,支持优先查询节点
MongoDB分组统计Group
MongoDB聚合分析方式:
聚合函数
聚合管道
MapReduce
db.collection.group({key,reduce,initial[,keyf][,cond][,finalize]})
3.4版本后过期,建议使用新的聚合:db.collection.aggregate()+$group或者db.collection.mapReduce()
2.2版本超过两万个文档,建议使用:db.collection.mapReduce()
2.3版本db.collection.group()阻塞其他执行
db.orders.group(
{
key:{name:1},
cond:{},
reduce:function(curr,result)
{result.total += curr.price;},
initial:{total:0}
}
)
分组统计不同年龄段的用户
db.users.group({key:{age:1},cond:{age:{$gt:16}},reduce:function(curr,result){result.total += 1;},initial:{total:0}})
分组统计不同用户的订单总额
db.orders.group({key:{name:1},cond:{},reduce:function(curr,result){result.total += curr.price;},initial:{total:0}})
db.users.group({key:{city:1},cond:{},reduce:function(curr,result){result.total += 1;},initial:{total:0}})
面试题:
MongoDB的优点
MongoDB4.0新特性
MongoDB的存储引擎分几种
MongoDB的存储引擎的差别
如何筛选嵌套文档中的字段?
分组聚合统计每个用户的订单价格?
分组聚合统计每个用户的嵌套订单文档中的价格?