起点是一个如下所示的集合:
{
"_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" } ] }
两个版本仍然可以找到这两个文件。
答案 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
})