javascript - 如何在 MongoDb .aggregate() 中的 $lookup 中添加条件?

标签 javascript node.js mongodb mongodb-query nosql

人员集合:

{
  "_id": ObjectId("5f3258cfbaaccedaa5dd2c96"),
  "gender": "male",
  "name": {
    "title": "mr",
    "first": "victor",
    "last": "pedersen",//... more properties
} 

人员详细信息集合:

{
      "_id": ObjectId("5f3a91e68b1c26e68f9ed3ad"),
      "country": "India",
      "personid": ObjectId("5f3258cfbaaccedaa5dd2c96")
}

从人员处获取文档以及关联的人员详细信息,其中人员详细信息中的关联国家/地区为“印度”

因此,如果 10 人中只有 3 人来自印度。我应该在结果集中获取 3 个人文档及其关联的个人详细信息

查询:

 [
    {
      "$match": {
      "$or": [
         
        {
          "$expr": {
            "$eq": [
              "$gender",
              "male"
            ]
          }
        }
      ]
    }
  },
  {
    "$facet": {
      "totalCount": [
        {
          "$count": "value"
        }
      ],
      "data": [
        {
          "$project": {
            "_id": "$_id",
            "fname": "$name.first",
            "lname": "$name.last",
            "dobage": "$dob.age",
            "registeredAge": "$registered.age"                
          }
        },
        {
          "$sort": {
            "name.first": 1
          }
        } ,
        {
          "$lookup": {
            "from": "persondetails",
            "localField": "_id",
            "foreignField": "personid", // how to add where clause in this lookup?
            "as": "persondetail" 
          }
        }
      ]
    }
  }
]

编辑:

https://mongoplayground.net/p/3vBs6Frt-aK

预期结果:

[
  {
    "data": [
      {
        "_id": ObjectId("5f3258cfbaaccedaa5dd2c96"),
        "fname": "victor",
        "lname": "pedersen",
        "persondetail": [
          {
            "_id": ObjectId("5f3a91e68b1c26e68f9ed3ad"),
            "country": "India",
            "personid": ObjectId("5f3258cfbaaccedaa5dd2c96")
          }
        ]
      }],
    "totalCount": [
      {
        "value": 1
      }
    ]
  }
]

最佳答案

还有第二个$lookup允许您指定自定义过滤条件的语法:

{
    "$lookup": {
        "from": "persondetails",
        "let": { person_id: "$_id" },
        "pipeline": [
            {
                $match: {
                    $expr: {
                        $and: [
                            { $eq: [ "$$person_id", "$personid" ] },
                            { $eq: [ "$country", "India" ] },
                        ]
                    }
                }
            }
        ],
        "as": "persondetail" 
    }
}

编辑: 您还需要添加 $match 来过滤掉 persondetail 为空的人员,如果您希望将其包含在计数中,那么您需要运行 $facet 作为最后一个操作:

[
    {
        "$match": {
            "$or": [ {"$expr": { "$eq": [ "$gender", "male" ] } } ]
        }
    },
    {
        "$project": {
                "_id": "$_id",
                "fname": "$name.first",
                "lname": "$name.last",
                "dobage": "$dob.age",
                "registeredAge": "$registered.age"                
        }
    },    
    {
        "$lookup": {
            "from": "persondetails",
            "let": { person_id: "$_id" },
            "pipeline": [
                {
                    $match: {
                        $expr: {
                            $and: [
                                { $eq: [ "$$person_id", "$personid" ] },
                                { $eq: [ "$country", "India" ] },
                            ]
                        }
                    }
                }
            ],
            "as": "persondetail" 
        }
    },
    {
        $match: {
            persondetail: { $ne: [] }
        }
    },
    {
        $facet: {
            totalCount: [ { $count: "value" } ],
            data: [ { $sort: { "name.first": 1 } },  ]
        }
    }
]

Mongo Playground

关于javascript - 如何在 MongoDb .aggregate() 中的 $lookup 中添加条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63709086/

相关文章:

javascript - Alexa API 调用没有返回任何内容

javascript - 逻辑与赋值

javascript - 如何在 JavaScript 中模拟 Selenium Webdriver 中的 HTML5 拖放

javascript - Mongoose - 如何使用多个更新语句进行单个更新

node.js - 在循环中向 EJS 显示 MongoDB 文档值

Javascript 在 html 文件和外部脚本文件中使用 onload 两次

javascript - 图表 : How can I group datasets closer if I have maxBarThickness set?

javascript - 如何在 NodeJS 中读取大文件(Excel)而不暂停 UI

node.js - 使用 http 基本身份验证从应用程序获取请求 (node.js)

arrays - Mongoose 查询 : Find an element inside an array