如果属性数组不包含对象,MongoDB会查找文档

时间:2014-12-11 14:14:27

标签: mongodb mongodb-query

我有这样的文件清单。

[
  {
     "name" : "test",
     "data" : [
         { "code" : "name", "value" : "Diego" },      
         { "code" : "nick", "value" : "Darko" },      
         { "code" : "special", "value" : true }
     ]
  },
  {
     "name" : "another",
     "data" : [
         { "code" : "name", "value" : "Antonio" },      
         { "code" : "nick", "value" : "Tony" }
     ]
  }
]

现在我需要找到所有文件:

a)不包含"数据"带代码"特殊"

的项目

OR

b)包含"数据"带代码的项目"特殊"并且值为false

我需要与 $ elemMatch 相反或者我错过了什么?

2 个答案:

答案 0 :(得分:4)

我假设您将每个文档作为集合test的单独成员插入到文档列表中。

对于a,

db.test.find({ "data.code" : { "$ne" : "special" } })

对于b。,

db.test.find({ "data" : { "$elemMatch" : { "code" : "special", "value" : false } } })

将两者与$or

结合起来
db.test.find({ "$or" : [
    { "data.code" : { "$ne" : "special" } },
    { "data" : { "$elemMatch" : { "code" : "special", "value" : false } } }
] })

答案 1 :(得分:0)

希望 $ ni n能解决您的问题。 我将您的文档插入“so”集合

  

db.so.find({})相当();

{
        "_id" : ObjectId("5489cd4f4cb16307b808d4b2"),
        "name" : "test",
        "data" : [
                { "code" : "name",
                  "value" : "Diego"
                },
                { "code" : "nick",
                  "value" : "Darko"
                },
                { "code" : "special",
                  "value" : true
                }
        ]
}
{
        "_id" : ObjectId("5489cd674cb16307b808d4b3"),
        "name" : "another",
        "data" : [
                {"code" : "name",
                 "value" : "Antonio"
                },
                { "code" : "nick",
                  "value" : "Tony"
                }
        ]
}

不包含代码为“special”的“数据”项

> db.so.find({"data.code":{$nin:["special"]}}).pretty();
{
        "_id" : ObjectId("5489cd674cb16307b808d4b3"),
        "name" : "another",
        "data" : [
                { "code" : "name",
                  "value" : "Antonio"
                },
                { "code" : "nick",
                  "value" : "Tony"
                }
        ]
}

包含代码为“special”且值为false

的“数据”项
  

db.so.find({$和:[{ “data.code”: “特殊”},{ “data.value”:假}]})。漂亮();