我制作了一个简化的集合来展示我的问题:
db.testcol.insert({ a: 1, msgs: [ { listname: "list1", someinfo: "info"}, { listname: "list2", someinfo: "info"}]});
db.testcol.insert({ a: 1, msgs: [ { listname: "list2", someinfo: "info"}]});
db.testcol.insert({ a: 1, msgs: [ { listname: "list3", someinfo: "info"}]});
db.testcol.insert({ a: 1, msgs: [ { listname: "list4", someinfo: "info"}]});
db.testcol.insert({ a: 1, msgs: [ ]});
db.testcol.insert({ a: 2 });
我需要从这个集合中获取所有文件,其中没有包含字段listname的对象:数组msgs中的“list1”,换句话说,除了第一个我需要所有文档。我有这个查询的问题,我想我应该使用$ nin运算符,但我找不到任何示例如何使用它与对象。我尝试过这样的查询:
db.testcol.find({ "msgs.listName": { "$nin":[ "list1" ] } }).pretty()
db.testcol.find({ "msgs": { "$nin":[ { listName: "list1" } ] } }).pretty()
但是他们所有人都没有按照我的需要工作我仍然无法得到正确的结果。提前谢谢。
答案 0 :(得分:3)
你有一个很常见的错误。
在您的收藏中,该字段的名称为listname
(请注意小写),而在您的查询中,该字段为名称listName
(请注意驼峰案例)。字段名称区分大小写。所以在将第一个查询调整为
db.testcol.find({ "msgs.listname": { "$nin":[ "list1" ] } }).pretty()
你得到了预期的结果。
修改强>
正如@NeilLunn在评论中正确指出的那样,根据问题排除单个值时更好的方法是:
db.testcol.find({ "msgs.listname": { "$ne": "list1" } })
当只需要排除一个值时,这种方法既清洁又快捷。
对他的所有荣誉。
答案 1 :(得分:-1)
db.testcol.find({'msgs.0.listname':{'$ne':'list1'}})