假设以下集合myCollection
:
{
values: [123, 456, 789],
name: "name1"
},
{
values: [123, 543, 654],
name: "name2"
},
{
values: [456, 876, 098],
name: "name3"
}
如何仅更新values
包含给定数组中任何值的文档?
示例:
var givenArray = [123, 078, 467];
db.myCollection.update(
{values:{$in:givenArray}},// <-- here is the problem
{$set:{updated:true}},
{multi:true}
);
由于values
是一个数组,$in
不起作用(当然,我猜单.update
不起作用)
预期输出应为:
{
values: [123, 456, 789],
name: "name1",
updated: true
},
{
values: [123, 543, 654],
name: "name2",
updated: true
},
{
values: [456, 876, 098],
name: "name3"
}
更新
有效的解决方案如下,但它似乎不是最佳的:
db.myCollection.find().forEach(function(doc){
givenArray.forEach(function(item){
if (doc.values.indexOf(item)>=0) {
db.myCollection.update(
{_id:doc._id},
{
$set:{updated:true}
},
{
multi:true
}
)
}
})
})
谢谢。
答案 0 :(得分:0)
如果要匹配givenArray的所有值,请使用$ all
{values:{$all:givenArray}}
如果你想匹配你的givenArray的一个值,那么使用$ in(你做了并且应该工作,即使是数组,请参阅this:使用$ in运算符来匹配数组中的值)
答案 1 :(得分:0)
db.yourColllection.update({values:{$ elemMatch:{$ in:[123,078,467]}}},{$ set:{updated:true}},{multi:true}); 应该是您正在寻找的最佳解决方案。