MongoDB - 查询集合的数组包含输入数组中的所有元素

MongoDB - Query collection's array contains all element in input array

假设我有以下文件:

[
  {
    array : ['a', 'b' , 'c'],
  },
  {
    array : ['b', 'd' , 'e'],
  },
  {
    array : ['d', 'e' , 'f'],
  },
]

查询输入数组:

["b","d","e","f"]

预期输出:

['b', 'd' , 'e'],['d', 'e' , 'f']

我可以使用哪个查询来做到这一点? 以及如何过滤哪些元素不在文档中?

预期结果:

[
  {
     array : ['b', 'd' , 'e'],
     missingElement : ['f']
  },
  {
     array : ['d', 'e' , 'f'],
     missingElement : ['b']
  },
]
  1. $expr - 允许使用聚合运算符。

    1.1。 $eq - 比较 1.1.11.1.2 的结果是否相等。

    1.1.1。 $size - 获取 array 字段的大小。

    1.1.2。 $size - 从结果中获取数组的大小 1.1.2.1.

    1.1.2.1。 $setIntersection - 将 array 字段和输入数组相交,return 数组中的相交值。

db.collection.find({
  $expr: {
    $eq: [
      {
        $size: "$array"
      },
      {
        $size: {
          $setIntersection: [
            "$array",
            [
              "b",
              "d",
              "e",
              "f"
            ]
          ]
        }
      }
    ]
  }
})

Sample Mongo Playground


已更新

对于查找缺失元素的聚合查询:

  1. $match - 过滤文档(如 $expr 的第一个答案中所述)。
  2. $project - 修饰输出文档。对于 missingElement 字段,需要 $filter 运算符来查找输入数组中不存在的每个值($not$in)在 array.
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $eq: [
          {
            $size: "$array"
          },
          {
            $size: {
              $setIntersection: [
                "$array",
                [
                  "b",
                  "d",
                  "e",
                  "f"
                ]
              ]
            }
          }
        ]
      }
    }
  },
  {
    $project: {
      array: 1,
      missingElement: {
        $filter: {
          input: [
            "b",
            "d",
            "e",
            "f"
          ],
          cond: {
            $not: {
              $in: [
                "$$this",
                "$array"
              ]
            }
          }
        }
      }
    }
  }
])

Sample Mongo Playground (Aggregation query)