我有两个独立的查询。
第一个是查找已删除的项目。
第二个是通过itemId检查是否所有物品都在同一国家被删除。
我可以将其合并为管道吗?
示例输入:
itemId removed country
1 true US
1 false TR
2 true US
2 true RU
示例输出:
itemId: 2
预期:(itemId: 2
) 按 itemId 查找从所有国家/地区删除的 itemId。
我的代码如下:
db.collection.find({removed: true}, {itemId: 1}) -> Extract itemIdList
forEach id: itemIdList: [1, 2]
if db.collection.find({removed: false, itemId: id}).count() > 0
remove itemId from itemIdList
return remainingItems: [2];
答案 0 :(得分:1)
您好,您可以通过按项目 ID 聚合第一组项目并计算移除的总数 true
和总项目来实现此目的。现在处于 $match
阶段,如果项目总数等于删除的真实计数,这意味着,此 itemId
对所有国家/地区都有 removed
true
,只需将 itemIds 推入大批。
Working solution
db.collection.aggregate([
{
"$group": {
"_id": "$itemId",
"itemsArrCount": {
"$sum": 1
},
"totalRemovedTrue": {
"$sum": {
"$cond": [
{ "$eq": ["$removed", true] },
1,
0
]
}
},
}
},
{
"$match": {
"$expr": {
"$eq": [ "$itemsArrCount", "$totalRemovedTrue"]
}
}
},
{
"$group": {
"_id": null,
"itemIds": {
"$push": "$_id"
}
}
}
])