在MongoDB中查找文档,其中数组字段是查询数组的子集

duc*_*thd 8 mongodb

假设我插入了一组文档,每个文档都有一个array字段.我想找到所有文档,使其array字段是查询数组的子集.例如,如果我有以下文件,

collection.insert([
  {
     'name': 'one',
     'array': ['a', 'b', 'c']
  },
  {
     'name': 'two',
     'array': ['b', 'c', 'd']
  },
  {
     'name': 'three',
     'array': ['b', 'c']
  }
])
Run Code Online (Sandbox Code Playgroud)

我询问collection.find({'array': {'$superset': ['a', 'b', 'c']}),我希望看到的文件one,并three['a', 'b', 'c']['b', 'c']的两个子集['a', 'b', 'c'].换句话说,我想要做的蒙戈的逆$all查询,它选择所有文件使得查询阵列是文档的子集array场.这可能吗?如果是的话,怎么样?

Asy*_*sky 9

使用聚合框架或查找查询有一种简单的方法.

查找查询很简单,但您必须使用$ elemMatch运算符:

> db.collection.find({array:{$not:{$elemMatch:{$nin:['a','b','c']}}}}, {_id:0,name:1})
Run Code Online (Sandbox Code Playgroud)

注意,这表明我们想要不匹配具有(同时)不等于'a','b'或'c'的元素的数组.我添加了一个投影,它只返回结果文档的名称字段,这是可选的.


diy*_*ism 9

在MongoDb中,对于数组字段:

"$in:[...]" means "intersection" or "any element in",
"$all:[...]" means "subset" or "contain",
"$elemMatch:{...}" means "any element match"
"$not:{$elemMatch:{$nin:[...]}}" means "superset" or "in"
Run Code Online (Sandbox Code Playgroud)