使用$lookup指定多个加入条件
在mongodb中使用aggregate进行关联查询,我们会使用到$lookup
,有时需要对子文档进行条件、分组、排序等操作,这是就得使用pipeline
(管道)对子文档进行操作。
管道操作符支持:
- $match:在管道开始可以过滤文档
- $sort:排序。只要之前没有$project、$unwind或$group,可以使用索引
- $group:对文档分组,相当于
group by
- $geoNear:与坐标相关,用得较少
举个例子
现有文档:
project(项目组):
1 2 3 4 5 6
| { "_id" : ObjectId("1"), "code" : "ai", "name": "人工智能", "createTime": ISODate("2020-05-16T19:19:19.745+0000") }
|
product(产品):
1 2 3 4 5 6 7
| { "_id" : ObjectId("100"), "code" : "Face recognize", "name": "人脸识别", "project": "ai", "isDelete": 0 }
|
查询指定条件的项目组列表,并查询出项目组下的所有产品(关联字段project.code = product.project)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| db.project.aggregate([ { $match: {} }, { $lookup: { from: "product", let: { code: "$projectId" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ['$$projectId', '$project'] } { $eq: ['$isDelete', 0]}, ] } } } ], as: "products" } }, { $skip: 1 }, { $limit: 10}, { $sort: '-createTime' } ])
|
返回:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| { "_id" : "1", "code" : "ai", "name": "人工智能", "createTime": "2020-05-16T19:19:19.771Z", "products": [ { "_id" : "100", "code" : "Face recognize", "name": "人脸识别", "project": "ai", "isDelete": 0 } ] }
|