在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 } } })
有没有办法用基本操作符来完成这项工作?
答
使用$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
,因为“它对数组有一定的作用”。但是,如果你明白你在这里做什么,你会发现是多余的,并且可能表现不佳。
好奇,为什么'$ nin'而不是'$ ne'?难道你不能'db.collection.find({'docs.foo':{$ ne:1}})'? (即同样的事情,但不需要1在数组中,如在[aedm的回答](http://stackoverflow.com/a/38684656/3391108)) – tscizzle 2016-11-01 19:13:39
@tscizzle是的,'$ ne'是好的以及如果只有一个值。 – JohnnyHK 2016-11-01 19:15:17
'$ ne'也应该更有效率(更快) – ztrange 2017-03-16 00:43:52