mongodb - 使用 $lookup mongodb 填充到深层

标签 mongodb mongoose mongodb-query aggregation-framework

我正在使用 $lookup 加入两个集合并从以下查询中获取数据:

let condition = {status:{$ne:config.PROJECT_STATUS.completed}, assignId:mongoose.Types.ObjectId(req.params.id)};
Project.aggregate([
    {
      $match: condition  
    },
    {
      "$group":{
        "_id": "$_id"
      }
    },
    { 
      "$lookup": {
        "from": "worksheets",
        "let": { "projectId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": [ "$projectId", "$$projectId" ] }}},
          { "$group": {_id:"$projectId", totalHours:{"$sum": "$hours"}}},
          { 
            "$lookup": {
              "from": "projects",
              "let": { "projectId": "$_id" },
              "pipeline": [
                { "$match": { "$expr": { "$eq": [ "$_id", "$$projectId" ] }}},
                { "$project": { "projectName": 1,"upworkdId":1,"status":1,"developers":1,"hoursApproved":1 }}
              ],
              "as": "project"
            }
          }
        ],
        "as": "projects"
      }
    }
])
.then((data)=>{
    res.json(data);
})

上面的查询给了我下面的结果:
[
  {
    "_id": "5c0a4083753a321c6c4ee024",
    "projects": [
        {
            "_id": "5c0a4083753a321c6c4ee024",
            "totalHours": 11,
            "project": [
                {
                    "_id": "5c0a4083753a321c6c4ee024",
                    "hoursApproved": 24,
                    "developers": [
                        "5c0a29c697e71a0d28b910a9"
                    ],
                    "projectName": "fallbrook winery",
                    "status": "pending"
                }
            ]
        }
    ]
  }
]

现在我想填充 开发人员 内的子字段项目大批。我怎样才能修改上面的代码来得到它。

最佳答案

您可以使用 $lookup 使用 developers 再深入一层大批。

像这样的东西

Project.aggregate([
  { "$match": condition },
  { "$group": { "_id": "$_id" }},
  { "$lookup": {
    "from": "worksheets",
    "let": { "projectId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$projectId", "$$projectId"] } } },
      { "$group": { "_id": "$projectId", "totalHours": { "$sum": "$hours" } }},
      { "$lookup": {
        "from": "projects",
        "let": { "projectId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": ["$_id", "$$projectId"] } } },
          { "$lookup": {
            "from": "developers",
            "let": { "developers": "$developers" },
            "pipeline": [
              { "$match": { "$expr": { "$in": ["$_id", "$$developers"] } } },
            ],
            "as": "developers"
          }},
          { "$project": { 
            "projectName": 1, "upworkdId": 1, "status": 1, "developers": 1,  "hoursApproved": 1
          }}
        ],
        "as": "project"
      }}
    ],
    "as": "projects"
  }}
])

关于mongodb - 使用 $lookup mongodb 填充到深层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722295/

相关文章:

node.js - Mongoose 查询以增加项目数组中的字段(如果存在),否则将其添加到文档中(很难表述此标题)

mongodb - 你如何找到两层深的mongodb记录

javascript - 为什么在查询中条件不匹配时数据被删除

linux - 多行复制粘贴到 mongo shell

javascript - 当嵌套文档存在时,如何验证嵌套文档的属性是否存在?

node.js - Mongoose 不同并填充文档

javascript - Node.js 和 MongoDB 无法规范化查询

python - 为什么 Flask + Mongoengine 不允许显示与数据库模型不完全对应的数据库项?

javascript - 异步系列 : variable number of callbacks

mongodb - 安装 Mongo 和 chown/data/db 会产生 "illegal user name"错误