MongoDB aggregate-根据另一个数组中对象的存在情况,在数组中的每个元素中设置布尔值

MongoDB aggregate-根据另一个数组中对象的存在情况,在数组中的每个元素中设置布尔值,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个聚合管道,当前返回示例列表: [ { "_id": "5b527a2bfadb811c4869e802", "tasks": [ { "done": false, "_id": "5b53494987eea4171d199dd3" }, { "done": false,

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

[
    {
        "_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
标志。仅当
任务中存在
doneTasks\u id
时,done
元素才设置为
true
。 我很确定我应该使用
$map
$in
操作符,但是我目前无法达到我需要的效果。
非常感谢您的帮助

您可以在下面尝试

基本上,您需要通过聚合对每个任务进行循环,并使用聚合检查
doneTasks\u id
数组中的
\u id

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
      }
    ]
  }
]
你可以试试