findAndModify嵌套文档数组中具有相同值的文档

时间:2015-07-25 17:45:13

标签: mongodb mongodb-query

起点是一个如下所示的集合:

{
    "_id" : ObjectId("55b3c75d84251af91782ea07"),
    "arr" : [
        {
            "val" : "yes"
        },
        {
            "val" : "yes"
        }
    ]
}
{
    "_id" : ObjectId("55b3c76184251af91782ea08"),
    "arr" : [
        {
            "val" : "yes"
        },
        {
            "val" : "no"
        }
    ]
}
...

我想要找的是yes中只有arr.val的文档。请注意,您需要使用findAndModify,因为我之后需要更新文档。

我尝试过的事情:

> db.coll.find({arr: {$all: [{$elemMatch: {val: 'yes'}}]}})
{ "_id" : ObjectId("55b3c75d84251af91782ea07"), "arr" : [ { "val" : "yes" }, { "val" : "yes" } ] }
{ "_id" : ObjectId("55b3c76184251af91782ea08"), "arr" : [ { "val" : "yes" }, { "val" : "no" } ] }
> db.coll.find({arr: {$all: [{val: 'yes'}]}})
{ "_id" : ObjectId("55b3c75d84251af91782ea07"), "arr" : [ { "val" : "yes" }, { "val" : "yes" } ] }
{ "_id" : ObjectId("55b3c76184251af91782ea08"), "arr" : [ { "val" : "yes" }, { "val" : "no" } ] }

两个版本仍然可以找到这两个文件。

1 个答案:

答案 0 :(得分:1)

您可以使用$eq$ne的组合来查找包含至少一个arr元素且val'yes'的文档,以及没有元素的值为'no'

db.coll.find({"arr.val": {$eq: 'yes', $ne: 'no'}})

仅匹配第一个文档:

{
    "_id" : ObjectId("55b3c75d84251af91782ea07"),
    "arr" : [
        {
            "val" : "yes"
        },
        {
            "val" : "yes"
        }
    ]
}

findAndModify

db.coll.findAndModify({
    query: {"arr.val": {$eq: 'yes', $ne: 'no'}}, 
    update: {$set: {a: 1}}, 
    new: true
})