Mongoose聚合查询以过滤ref集合中的值



我有两个集合,如下所示:

事件

{
"_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"}}])

如果我理解正确,你可以使用这个聚合查询:

此查询使用$lookuppipeline,其中结果由与$in的匹配给出。因此,join将返回数组event.eventActivityevent-activity.activity所在的值。

db.event.aggregate([
{
"$lookup": {
"from": "event-activity",
"as": "activities",
"let": {
"ea": "$eventActivity"
},
"pipeline": [
{
"$match": {
"$expr": {
"$in": [
"$activity",
"$$ea"
]
}
}
}
]
}
}
])

这里的示例中,我使用了整数作为activity,以便更容易地进行连接。

最新更新