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

问题描述:

我试图找到所有文档不包含至少一个具有特定字段值的文档。例如这里是一个样本收集:在MongoDB中查找包含不包含具有特定字段值的文档的数组的文档

{ _id : 1, 
    docs : [ 
     { foo : 1, 
      bar : 2}, 
     { foo : 3, 
      bar : 3} 
     ] 
}, 
{ _id : 2, 
    docs : [ 
     { foo : 2, 
      bar : 2}, 
     { foo : 3, 
      bar : 3} 
     ] 
} 

我想找到的每个记录那里是不是在文档块的文件不包含以foo = 1的至少一个记录在上面的例子中,只有第二份文件应该被退回。

我曾尝试以下,但它只是告诉我,如果有任何不匹配(返回文档1.

db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } }) 

UPDATE:上面实际上做的工作,因为许多查询。我的数据是错误的,而不是我的代码

我也看过$nin operator,但这些例子只显示当数组包含一个原始值列表,而不是一个额外的文档当我试图做这与类似以下的东西,它寻找的是EXACT文件而不是ju我想要的foo领域。

db.collection.find({"docs": { $nin: {'foo':1 } } }) 

有没有办法用基本操作符来完成这项工作?

使用$nin可以工作,但是您的语法错误。它应该是:

db.collection.find({'docs.foo': {$nin: [1]}}) 
+4

好奇,为什么'$ nin'而不是'$ ne'?难道你不能'db.collection.find({'docs.foo':{$ ne:1}})'? (即同样的事情,但不需要1在数组中,如在[aedm的回答](http://*.com/a/38684656/3391108)) – tscizzle 2016-11-01 19:13:39

+1

@tscizzle是的,'$ ne'是好的以及如果只有一个值。 – JohnnyHK 2016-11-01 19:15:17

+0

'$ ne'也应该更有效率(更快) – ztrange 2017-03-16 00:43:52

使用$ne操作:

db.collection.find({'docs.foo': {$ne: 1}}) 

更新:我建议不要在这种情况下使用$nin

{'docs.foo': {$ne: 1}}docs的所有元素,并且对于其中的每个元素,它检查foo字段是否等于1。如果找到匹配项,它将放弃结果列表中的文档。

{'docs.foo': {$nin: [1]}}需要的docs所有元素,并且每个元素它检查其foo字段是否匹配任何阵列[1]成员。这是一个Cartesian product,你比较一个数组与另一个数组,每个元素的每个元素。虽然MongoDB可能很聪明,并且可以优化这个查询,但我认为你只使用$nin,因为“它对数组有一定的作用”。但是,如果你明白你在这里做什么,你会发现是多余的,并且可能表现不佳。