1.数据mock

$project,$match,$group,$sort,$limit,$skip,$lookup表关联

  1. //管道后面是数组,数组中是对象,每一个对象实现特定的功能
  2. db.order.aggregate([{},{}])

order表

order.png

order_item表

order_item.png

1.1$project 查询指定的字段

  1. //只选中order表order_id,all_price两条数据
  2. db.order.aggregate([{$project:{order_id:1,all_price:1}}])
  3. //以下效果相同
  4. db.order.find({},{order_id:1,all_price:1})

1.2 $match 过滤文档。用法类似于find()方法中的参数

  1. db.order.aggregate([{$project:{trade_no:1,all_price:1}},{$match:{all_price:{$gte:90}}}])
  2. //以下效果相同
  3. db.order.find({all_price:{$gte:90}},{all_price:1,trade_no:1})
  1. //输出结果为
  2. { "_id" : ObjectId("5cd23aaa2d6748197416293c"), "trade_no" : "111", "all_price" : 100 }
  3. { "_id" : ObjectId("5cd23b093d9d191974e5e906"), "trade_no" : "222", "all_price" : 90 }

1.3 $group 将集合中的文件进行分组统计。

  1. //以下order_id进行分组,对order_id的价格结构进行统计
  2. db.order_item.aggregate([{$group:{_id:"$order_id",total:{$sum:"$price"}}}])
  1. //输出
  2. { "_id" : "3", "total" : 12 }
  3. { "_id" : "2", "total" : 90 }
  4. { "_id" : "1", "total" : 100 }

1.4 $sort将集合中文档进行排序

  1. db.order.aggregate([{$project:{all_price:1}},{$sort:{"all_price":-1}}])

1.5$limit限制几条

  1. db.order.aggregate([{$project:{all_price:1}},{$limit:2}])

1.6 $skip跳过几条

  1. db.order.aggregate([{$project:{all_price:1}},{$skip:1}])

1.7 $lookup表的关联操作

  1. //实现以下数据结构
  2. [
  3. {
  4. order_id:"1",
  5. trade_no:"111",
  6. items:[
  7. {
  8. title:"鼠标",
  9. price:20
  10. },
  11. {
  12. title:"键盘",
  13. price:20
  14. }
  15. ]
  16. },
  17. {
  18. order_id:"2",
  19. trade_no:"222",
  20. items:[
  21. {
  22. title:"牛奶",
  23. price:20
  24. },
  25. {
  26. title:"酸奶",
  27. price:20
  28. }
  29. ]
  30. }
  31. ]
  1. db.order.aggregate([{$lookup:
  2. {
  3. from:"order_item",
  4. localField:"order_id",
  5. foreignField:"order_id",
  6. as:"items"
  7. }
  8. }
  9. ])