MongoDB 中的关系可以是:
- (1对1)
eg:一个人一张身份证 - (1对多)
eg:一个班级多个学生 - (多对1)
eg: 多个学生一个班级 - (多对多)
eg: 一个商品被多人购买,一个人购买多个商品
MongoDB 聚合管道(Aggregation Pipeline)
使用聚合管道可以对集合中的文档进行变换和组合。
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
管道操作符
$project 修改文档的结构,可以用来重命名、增加或删除文档中的字段。
$match 用于过滤文档。用法类似于 find() 方法中的参数。
$limit 用来限制MongoDB聚合管道返回的文档数
$skip 在聚合管道中跳过指定数量的文档,并返回余下的文档。
$sort 将输入文档排序后输出
$group 将集合中的文档进行分组,可用于统计结果
$lookup 可以引用其他集合的数据(表关联查询)
创建数据
db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2})
db.order.insert({"order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2})
db.order.insert({"order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6})
db.order_item.insert({"order_id":"1","title":"商品鼠标 1","price":50,num:1})
db.order_item.insert({"order_id":"1","title":"商品键盘 2","price":50,num:1})
db.order_item.insert({"order_id":"1","title":"商品键盘 3","price":0,num:1})
db.order_item.insert({"order_id":"2","title":"牛奶","price":50,num:1})
db.order_item.insert({"order_id":"2","title":"酸奶","price":40,num:1})
db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,num:5})
db.order_item.insert({"order_id":"3","title":"毛巾","price":10,num:1})
order_item集合中的数据
order集合中的数据
-
- $project
eg: 要求查找 order 只返回文档中 trade_no 和 all_price 字段
db.order.aggregate([ { $project:{ _id:0,//不包含_id trade_no:1, //包含trade_no all_price:1,//包含all_price } } ])
- $project
-
- $match
eg: 找出order集合中all_price大于等于90的数据,只保留trade_no和all_price字段
db.order.aggregate([ { $project:{ _id:0,trade_no:1, all_price:1 } }, { $match:{"all_price":{$gte:90}} } ])
- $match
-
- $group
eg:统计每个订单的订单数量,按照订单号分组
db.order_item.aggregate( [ { $group: {_id: "$order_id", total: {$sum: 1}} } ] )
- $group
-
- $sort
将集合中的文档进行排序。
eg: 统计只有trade_no和all_price字段,并且只要all_price大于等于90的,all_price按倒序排列
db.order.aggregate([ { $project:{ _id:0, trade_no:1, all_price:1 } }, { $match:{"all_price":{$gte:90}} }, { $sort:{"all_price":-1} } ])
- $sort
- $limit
eg: 统计只有trade_no和all_price字段,并且只要all_price大于等于90的倒序排列,只取第一项db.order.aggregate([ { $project:{ trade_no:1, all_price:1 } }, { $match:{"all_price":{$gte:90}} }, { $sort:{"all_price":-1} }, { $limit:1 } ])
- $skip
eg: 统计只有trade_no和all_price字段,并且只要all_price大于等于90的倒序排列,跳过一项db.order.aggregate([ { $project:{ trade_no:1, all_price:1 } }, { $match:{"all_price":{$gte:90}} }, { $sort:{"all_price":-1} }, { $skip:1 } ])
- $lookup 表关联
eg: 两个表的数据合并找出有用的数据,拼接成有效接口db.order.aggregate([ { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "items" } }, { $project: { _id:0, trade_no: 1, all_price: 1,items: 1 } } ]).pretty() //pretty格式化文档(json格式化) //$lookup: { //from: "order_item", 附属表 //localField: "order_id", 主表order对应的字段 //foreignField: "order_id", 附属表order_item对应的字段 //as: "items" 新的字段名 }
网友评论