MongoDb查询$或$ and

时间:2018-10-25 09:31:44

标签: mongodb

我在收藏夹中有以下类型的文件:

{"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 ac上方的示例数据应产生结果,而b不产生结果。

需要MongoDb 3.4的支持。

1 个答案:

答案 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"}}
])