更新文档mongodb中的所有子文档

时间:2014-05-01 01:37:57

标签: mongodb mongodb-query

我想要这样的东西

db.students.update( 
    { "_id": 4, "grades.grade": 85 }, 
    { 
        "$set": { "grades.$.std" : 6 } 
    } 
)

但我想更新所有“成绩”,不仅仅是第一个,如$ explain

当我尝试它时只需更新第一个。有关更新整个清单的任何想法吗?

3 个答案:

答案 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