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