mongo 使用$lookup指定多个加入条件
在mongodb中使用aggregate进行关联查询,我们会使用到$lookup
,有时需要对子文档进行条件、分组、排序等操作,这是就得使用pipeline
(管道)对子文档进行操作。
管道操作符支持:
- $match:在管道开始可以过滤文档
- $sort:排序。只要之前没有$project、$unwind或$group,可以使用索引
- $group:对文档分组,相当于
group by
- $geoNear:与坐标相关,用得较少
举个例子
现有文档:
project(项目组):
{
"_id" : ObjectId("1"),
"code" : "ai",
"name": "人工智能",
"createTime": ISODate("2020-05-21T19:19:19.745+0000")
}
product(产品):
{
"_id" : ObjectId("100"),
"code" : "Face recognize",
"name": "人脸识别",
"project": "ai",
"isDelete": 0
}
查询指定条件的项目组列表,并查询出项目组下的所有产品(关联字段project.code = product.project)
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' }
])
返回:
{
"_id" : "1",
"code" : "ai",
"name": "人工智能",
"createTime": "2020-05-21T19:19:19.771Z",
"products": [
{
"_id" : "100",
"code" : "Face recognize",
"name": "人脸识别",
"project": "ai",
"isDelete": 0
}
]
}