在MongoDB中查找数组中不包含具有特定字段值的文档的文档

在MongoDB中查找数组中不包含具有特定字段值的文档的文档,mongodb,Mongodb,我正在尝试查找所有不包含至少一个具有特定字段值的文档的文档。例如,以下是一个样本集合: { _id : 1, docs : [ { foo : 1, bar : 2}, { foo : 3, bar : 3} ] }, { _id : 2, docs : [ { foo : 2, bar : 2}, { foo : 3, b

我正在尝试查找所有不包含至少一个具有特定字段值的文档的文档。例如,以下是一个样本集合:

{  _id : 1,
  docs : [
        { foo : 1,
          bar : 2},
        { foo : 3,
          bar : 3}
         ]
},
{  _id : 2,
  docs : [
        { foo : 2,
          bar : 2},
        { foo : 3,
          bar : 3}
         ]
}
我想找到docs块中没有文档的每个记录,该文档不包含至少一条foo=1的记录。在上面的示例中,只应返回第二个文档

我尝试了以下内容,但它只告诉我是否有不匹配的内容(返回文档1)

db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } })
更新:上面的查询确实有效。很多时候,我的数据是错误的,而不是我的代码

我也看过了,但是示例只显示了数组包含基元值列表时的情况,而不是其他文档。当我尝试使用以下内容时,它会查找确切的文档,而不仅仅是我想要的foo字段

db.collection.find({"docs": { $nin: {'foo':1 } } })
使用基本运算符是否可以完成此操作?

使用将起作用,但语法错误。应该是:

db.collection.find({'docs.foo':{$nin:[1]})
使用操作员:

db.collection.find({'docs.foo': {$ne: 1}})
更新:我建议在这种情况下不要使用
$nin

{'docs.foo':{$ne:1}
获取
docs
的所有元素,并检查每个元素的
foo
字段是否等于1。如果找到匹配项,则从结果列表中丢弃该文档


{'docs.foo':{$nin:[1]}
获取
docs
的所有元素,并为每个元素检查其
foo
字段是否与数组的任何成员匹配
[1]
。这是一个,您将一个数组与另一个数组进行比较,每个元素与每个元素进行比较。虽然MongoDB可能很聪明并优化了此查询,但我假设您只使用
$nin
,因为“它与数组有关”但是如果你明白你在这里做什么,你就会意识到,
$nin
是多余的,并且可能有低于标准的性能。

奇怪的是,为什么
$nin
而不是
$ne
?你不能做
db.collection.find({docs.foo':{$ne:1}})
?(也就是说,同样的事情,但不需要1在一个数组中,如中)@Tcizzle是的,
$ne
如果只有一个值也可以。
$ne
也应该更高效(更快)一点。这是一个笛卡尔产品,阵列只有一个元素:不确定在这种情况下性能命中率有多高。我们必须制定一个基准。