我如何在mongodb上执行“ $ all $ in”?

时间:2018-06-21 20:35:38

标签: arrays mongodb match

我有以下收藏

>db.prueba.find({})
{ "_id" : "A", "requi" : null }
{ "_id" : "B", "requi" : null }
{ "_id" : "C", "requi" : [ "A" ] }
{ "_id" : "D", "requi" : [ "A", "B" ] }
{ "_id" : "E", "requi" : [ "C" ] }
{ "_id" : "F", "requi" : [ "B", "D"] }
{ "_id" : "G", "requi" : [ "F" ] }

我需要requi字段的每个元素都在以下数组中。在这种情况下,数组只有一个元素

["A", "D"]

当我使用运算符$all $in时,返回以下内容

 >db.prueba.find({requi:{$elemMatch:{$in:['A','D']}}})
{ "_id" : "C", "requi" : [ "A" ] }
{ "_id" : "D", "requi" : [ "A", "B" ] }
{ "_id" : "F", "requi" : [ "B", "D" ] }

查询必须仅返回文档,因为'B'在数组["A" , "D"]中不存在

{ "_id" : "C", "requi" : [ "A" ] }

请帮助我

1 个答案:

答案 0 :(得分:1)

您可以使用$setIsSubset来检查给定数组是否是requi数组的集合,然后使用$redact来消除不匹配的数组。

db.collection.aggregate([
  { "$match": { "requi": { "$ne": null } } },
  { "$redact": {
    "$cond": {
      "if": { "$eq": [{ "$setIsSubset": ["$requi", ["A", "D"]] }, true] },
      "then": "$$DESCEND",
      "else": "$$PRUNE"
    }
  }}
])