抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

使用$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
}
]
}

评论