我正在尝试查找所有不包含具有特定字段值的文档的文档。例如,这是一个示例集合:
{ _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 } } } })
更新: 上面的查询实际上是有效的。像很多时候一样,我的数据出了问题,而不是我的代码。
我也查看了$nin操作符,但示例仅显示数组包含原始值列表的情况,而不是附加文档的情况。当我尝试使用以下内容进行操作时,它会查找完整的文档,而不仅仅是我想要的foo字段。
db.collection.find({"docs": { $nin: {'foo':1 } } })
有没有使用基本运算符完成这个任务的方法?
$nin
而不是$ne
?你不能这样做吗:db.collection.find({'docs.foo': {$ne: 1}})
?(即相同的操作,但无需将1放入数组中,例如aedm's answer)。 - tscizzle$ne
也可以使用。 - JohnnyHK$ne
也应该更加高效(更快)。 - ztrange