【问题标题】:Update all sub-documents inside document mongodb更新文档 mongodb 中的所有子文档
【发布时间】:2018-05-16 20:03:50
【问题描述】:

我想要这样的东西

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

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

当我尝试它时,只需更新第一个。关于更新整个列表的任何想法?

【问题讨论】:

  • 有人在快速拨号上有这个副本吗?
  • @NeilLunn 在快速拨号上?

标签: mongodb mongodb-query


【解决方案1】:

您不能使用单个 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);
});

【讨论】:

    【解决方案2】:

    我将提供比评论更长的解释,并且目前缺乏搜索,这不仅仅是对 JIRA 中功能请求的引用。

    因此,正如位置 $ 运算符的文档所述,您只能获得第一个匹配项,而这就是目前设计的工作方式。

    可能您最好的方法是继续发布相同的更新,直到写入关注结果的响应表明实际上没有任何更新。这将依次将数组中匹配的每个元素设置为所需的值。

    否则,使用查找请求拉取整个文档,在代码中更改数组中所需的元素,然后将其保存回来。

    投票赞成引用的功能请求,并祈祷有人认为它足够重要,可以包含在不久的将来的版本中。但是没有其他方法可以让你这样做。

    注意:功能请求目前已有四年之久,所以我不会屏住呼吸等待它发生。

    【讨论】:

    • 让我们编写一个脚本。还是谢谢。
    【解决方案3】:

    我的回答在这里为时已晚,但它可以帮助其他面临此问题的人。 请查看这个 JIRA 线程,它声明您可以更新所有匹配的文档: https://jira.mongodb.org/browse/SERVER-1243

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2014-09-26
      • 2017-08-22
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多