我想要这样的东西
db.students.update(
{ "_id": 4, "grades.grade": 85 },
{
"$set": { "grades.$.std" : 6 }
}
)
但我想更新所有“成绩”,不仅仅是第一个,如$ explain
当我尝试它时只需更新第一个。有关更新整个清单的任何想法吗?
答案 0 :(得分:4)
您无法使用单个mongodb查询更新文档中数组的所有元素,您可以将以下代码用于您的目的
db.students.find({"grades.grade": 85 }).forEach(function(item){
//iterate over matched docs
item.grades.forEach(function(c){ //iterate over array element in the current doc
if(c.grade==85){
c.std=6;
}
});
db.students.save(item);
});
答案 1 :(得分:1)
我会提供比评论更长的解释和当前缺乏搜索,而不仅仅是JIRA中对功能请求的引用。
因此,正如位置$
运算符的文档所说,您只能获得第一个匹配,而这正是目前设计工作的方式。
可能你最好的方法是继续发出相同的更新,直到写关注结果的响应表明没有实际更新。这将在每个回合中将数组中匹配的每个元素设置为所需的值。
否则,使用查找请求拉出整个文档,在代码中更改数组中所需的元素,然后将其保存回来。
投票推荐引用的功能请求,并指出有人发现它非常重要,可以在不久的将来发布。但是没有其他方法可以让你做到这一点。
注意:功能请求目前已有四年了,所以我不会屏住呼吸。
答案 2 :(得分:0)
我的答案为时已晚,但它可以帮助其他人面对这个问题。 请查看它已声明您可以更新所有匹配文档的JIRA线程: https://jira.mongodb.org/browse/SERVER-1243