MongoDB聚合-根据另一个数组中对象的存在在数组的每个元素中设置布尔值

时间:2018-07-21 17:31:56

标签: mongodb aggregation-framework

我有一个聚合管道,该管道当前返回示例列表:

[
    {
        "_id": "5b527a2bfadb811c4869e802",
        "tasks": [
            {
                "done": false,
                "_id": "5b53494987eea4171d199dd3"
            },
            {
                "done": false,
                "_id": "5b53495087eea4171d199dd4"
            },
            {
                "done": false,
                "_id": "5b53495987eea4171d199dd5"
            }
        ],
        "doneTasks_ids": [
            "5b53494987eea4171d199dd3",
            "5b53495087eea4171d199dd4"
        ]
    },
    {
        "_id": "5b527a2ffadb811c4869e803",
        "tasks": [
            {
                "done": false,
                "_id": "5b53496b87eea4171d199dd6"
            },
            {
                "done": false,
                "_id": "5b53497287eea4171d199dd7"
            }
        ],
        "doneTasks_ids": [
            "5b53497287eea4171d199dd7"
        ]
    }
]

现在,仅当done中存在tasks.done时,我才想将每个true元素的tasks._id标志设置为doneTasks_ids。 我很确定我应该使用$map$in运算符,但是我目前无法达到所需的效果。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

您可以尝试以下汇总

基本上,您需要通过$map聚合来遍历每个任务,并使用$in聚合来检查_id数组中的doneTasks_ids

db.collection.aggregate([
  { "$addFields": {
    "tasks": {
      "$map": {
        "input": "$tasks",
        "as": "task",
        "in": {
          "_id": "$$task._id",
          "done": {
            "$in": ["$$task._id", "$doneTasks_ids"]
          }
        }
      }
    }
  }}
])

输出

[
  {
    "_id": "5b527a2bfadb811c4869e802",
    "doneTasks_ids": [
      "5b53494987eea4171d199dd3",
      "5b53495087eea4171d199dd4"
    ],
    "tasks": [
      {
        "_id": "5b53494987eea4171d199dd3",
        "done": true
      },
      {
        "_id": "5b53495087eea4171d199dd4",
        "done": true
      },
      {
        "_id": "5b53495987eea4171d199dd5",
        "done": false
      }
    ]
  },
  {
    "_id": "5b527a2ffadb811c4869e803",
    "doneTasks_ids": [
      "5b53497287eea4171d199dd7"
    ],
    "tasks": [
      {
        "_id": "5b53496b87eea4171d199dd6",
        "done": false
      },
      {
        "_id": "5b53497287eea4171d199dd7",
        "done": true
      }
    ]
  }
]

您可以尝试here