如何获取MongoDB中数组中的字段不等于特定值的文档?

时间:2017-08-28 07:18:43

标签: mongodb

数据库集合中的文档格式如下

{
  _id:1,
  a: [{b:1, c:2, d:3}, {b:2, c:3, d:4}]
},
{
  _id:2,
  a: [{b:2, c:2, d:4}, {b:3, c:5, d:4}]
},
{
  _id:3,
  a: [{b:4, c:4, d:3}, {b:5, c:3, d:2}]
}

从上面的文件中我只需要获得'b!= 4'的文件,这意味着只有_id = 1&应返回_id = 2。

为此,我尝试了以下查询,但我没有得到预期的结果。相反,我得到了所有文件。

db.collectionname.find({a: {$nin: [{b: 4}]}})

任何替代解决方案,请帮帮我。

1 个答案:

答案 0 :(得分:3)

你正在使用错误的操作员。您应该使用 $ne 而不是**$nin**

来自mongodb documentation

  

$ nin选择以下文件:

     
      
  • 字段值不在指定的数组中   或
  •   
  • 该字段不存在。
  •   

所以查询

db.collectionname.find({a: {$nin: [{b: 4}]}})

将查找数组a不包含此确切文档的文档:{b: 4}。这里有3个文档匹配,因为内部文档有bc个键,而{b: 4}没有。{1}}。

对于单个字段检查,您应该使用$ne

正确的查询是

db.collectionname.find({"a.b": {$ne: 4}})

返回:

{ "_id" : 1, "a" : [ { "b" : 1, "c" : 2, "d" : 3 }, { "b" : 2, "c" : 3, "d" : 4 } ] }
{ "_id" : 2, "a" : [ { "b" : 2, "c" : 2, "d" : 4 }, { "b" : 3, "c" : 5, "d" : 4 } ] }