我在收藏夹中有以下类型的文件:
{"action": "add", "text": "a"},
{"action": "remove", "text": "a"},
{"action": "add", "text": "a"},
{"action": "add", "text": "b"},
{"action": "remove", "text": "b"},
{"action": "add", "text": "c"},
现在,我想获取所有满足这些条件的所有条目:
text
匹配我的参数,例如a
action
等于add
个条目的条目,然后将action
等于remove
个条目的条目鉴于在查询action
a
或c
上方的示例数据应产生结果,而b
不产生结果。
需要MongoDb 3.4的支持。
答案 0 :(得分:2)
除了Veeram解决方案外,您还可以在文本字段上分组(无需匹配操作),以便按预期获得响应。
在操作a或c的查询上方看到示例数据,而b则不会产生结果。
db.collection.aggregate([
{"$group":{
"_id":"$text",
"action_add":{"$sum":{"$cond":[{"$eq":["$action","add"]},1,0]}},
"action_remove":{"$sum":{"$cond":[{"$eq":["$action","remove"]},1,0]}},
"data":{"$push":"$$ROOT"}
}},
{"$addFields":{"diff":{"$subtract":["$action_add","$action_remove"]}}},
{"$match":{"diff":1}},
{"$unwind":"$data"},
{"$replaceRoot":{"newRoot":"$data"}}
])