我有一个聚合管道,该管道当前返回示例列表:
[
{
"_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
运算符,但是我目前无法达到所需的效果。
任何帮助将不胜感激
答案 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