按子文档 ID 查找并更新其数据

Posted

技术标签:

【中文标题】按子文档 ID 查找并更新其数据【英文标题】:Find by Sub Document Id and update its data 【发布时间】:2018-06-01 03:48:13 【问题描述】:

通过多个 Id 按子文档查找并更新其数据。 下面的例子说通过grades.id查找数据并将其对应的平均值更新为100。

MongoDB 版本:3.4 和 3.6

按子文档 ID 更新子文档 - 子文档 ID 数组

架构:


    "_id" : 1,
    "grades" : [ 
        
            "id" : 1,
            "grade" : 80,
            "mean" : 75,
            "std" : 6
        , 
        
            "id" : 2,
            "grade" : 85,
            "mean" : 90,
            "std" : 4
        , 
        
            "id" : 3,
            "grade" : 85,
            "mean" : 85,
            "std" : 6
        
    ]

查询:

db.students.update(
    _id: 1,
     $set:  "grades.$[elem].mean" : 100  ,
    
        multi: true,
        arrayFilters: [  "elem._id":  $in: [1, 2]   ]
    
)

输出


    "_id" : 1,
    "grades" : [ 
        
            "id" : 1,
            "grade" : 100,
            "mean" : 75,
            "std" : 6
        , 
        
            "id" : 2,
            "grade" : 100,
            "mean" : 90,
            "std" : 4
        , 
        
            "id" : 3,
            "grade" : 85,
            "mean" : 85,
            "std" : 6
        
    ]

上面的查询我试过了,但是失败了

错误 不能使用部分(grades of grades.$[elem].mean)来遍历元素

【问题讨论】:

【参考方案1】:

无法对 v3.4 运行此查询,因为它根本不支持这个新的数组过滤功能。因此,您必须针对 v3.6 运行查询。

然后你可能会遇到以下两个问题:

    您的arrayFilters: [ "elem._id": $in: [1, 2] ] 应引用正确的字段名称,仅"elem.id"(不带下划线)。

    您可能正在使用 Robomongo(或类似的)作为客户端来运行您的查询。我不完全知道这里发生了什么,但这根本行不通。使用 Mongo shell 后,一切都会按预期工作。

【讨论】:

mongoose 是否支持 arrayFilters 这个问题也请参考 继续上面的问题***.com/questions/47881328/arrayfilter-in-mongoose

以上是关于按子文档 ID 查找并更新其数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中查找文档、更新文档并插入新文档?

查找并更新数组中列出的许多文档

按子文档字段分组文档

查找嵌套文档并相应地更新它

MongoDB命令查找单个文档并在更新中有条件语句

mongodb使用条件查找文档并更新相应文档中的另一个字段