我有两个集合,如下所示:
事件
{
"_id" : ObjectId("61f272dd1fac703fec69105a"),
"eventActivity" : [
ObjectId("61f76703196ea94bd43fa92e"),
]
}
事件活动
{
"_id" : ObjectId("61f76703196ea94bd43fa92e"),
"activity" : ObjectId("61f2a69bfe99e07db083de50"),
}
基于以上集合,事件具有eventActivity
字段,该字段指的是活动集合。我正试图通过event-activity.activity
的值来过滤该事件。
因此,例如,如果我的过滤选择在数组['61d6b2060d6fe32d9853ad40', '61f2a69bfe99e07db083de50']
中有活动,它将返回事件。如果筛选选择具有活动id['61d6b2060d6fe32d9853ad40']
,则不应返回任何事件,因为事件活动中没有具有该活动id的事件
我真的不明白聚合查找是如何工作的,但我试过了,但它不起作用。
event.aggregate([
{"$lookup":{
"from":"event-activity",
"localField":"activity",
"foreignField":"_id",
"as":"event-activity"
}},
{
"$match":{
"event-activity.activity":{
"$in":["61d6b2060d6fe32d9853ad40","61f2a69bfe99e07db083de50"]
}
}
}
])
我参考了这里的手册
或者可以由find()
代替?
查询
- 您可以使用管道查找并将匹配项放入
- 如果查找结果为空,则可以根据需要删除或保留文档,方法如下
{"$match":{"$expr":{"$ne":["$activities", []]}}}
此处测试代码
event.aggregate(
[{"$lookup":
{"from":"event-activity",
"localField":"eventActivity",
"foreignField":"_id",
"pipeline":
[{"$match":
{"activity":
{"$in":
[ObjectId("61d6b2060d6fe32d9853ad40"),
ObjectId("61f2a69bfe99e07db083de50")]}}}],
"as":"activities"}}])
如果我理解正确,你可以使用这个聚合查询:
此查询使用$lookup
和pipeline
,其中结果由与$in
的匹配给出。因此,join将返回数组event.eventActivity
中event-activity.activity
所在的值。
db.event.aggregate([
{
"$lookup": {
"from": "event-activity",
"as": "activities",
"let": {
"ea": "$eventActivity"
},
"pipeline": [
{
"$match": {
"$expr": {
"$in": [
"$activity",
"$$ea"
]
}
}
}
]
}
}
])
这里的示例中,我使用了整数作为activity
,以便更容易地进行连接。