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

Mongoose aggregate query to filter value from the ref collection

我有 2 个合集如下:

事件

{
    "_id" : ObjectId("61f272dd1fac703fec69105a"),
    "eventActivity" : [  
        ObjectId("61f76703196ea94bd43fa92e"),
    ]
}

事件-activity

{
    "_id" : ObjectId("61f76703196ea94bd43fa92e"),
    "activity" : ObjectId("61f2a69bfe99e07db083de50"),
}

基于上面的集合,eventeventActivity 字段引用 event-activity 集合.我正在尝试按 event-activity.activity.

的值过滤事件

因此,例如,如果我的过滤选择在数组 ['61d6b2060d6fe32d9853ad40', '61f2a69bfe99e07db083de50'] 中有 activity,它将 return 事件。如果过滤选择有 activity id ['61d6b2060d6fe32d9853ad40'],它不应该 return 任何事件,因为没有来自 event-[= 的 activity id 的事件45=]

我不太明白聚合查找是如何工作的,但我试过了,但它不起作用。

event.aggregate([
    {"$lookup":{
        "from":"event-activity",
        "localField":"activity",
        "foreignField":"_id",
        "as":"event-activity"
     }},
     {
         "$match":{
             "event-activity.activity":{
                 "$in":["61d6b2060d6fe32d9853ad40","61f2a69bfe99e07db083de50"]
              }
          }
      }
])

我参考了manual here

或者 find() 可以代替吗?

查询

  • 您可以使用管道查找并将匹配项放入其中
  • 如果查找结果为空,您可以根据需要删除或保留文档,像这样 {"$match":{"$expr":{"$ne":["$activities", []]}}}

Test code here

event.aggregate(
[{"$lookup":
  {"from":"event-activity",
   "localField":"eventActivity",
   "foreignField":"_id",
   "pipeline":
   [{"$match":
     {"activity":
      {"$in":
       [ObjectId("61d6b2060d6fe32d9853ad40"),
        ObjectId("61f2a69bfe99e07db083de50")]}}}],
   "as":"activities"}}])

如果我没理解错你可以使用这个聚合查询:

此查询使用 $lookuppipeline,其中结果由与 $in 的匹配给出。因此,连接将 return event-activity.activity 在数组 event.eventActivity.

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

示例 here 我将整数用作 activity 以便更轻松地查看连接。