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

时间:2017-12-18 18:46:18

标签: mongodb mongoose-schema

按子文档按多个ID查找并更新其数据。 下面的示例说明按grade.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
        }
    ]
}

我已尝试过上述查询,但失败

错误 无法使用该部分(成绩等级。$ [elem] .mean)遍历元素

1 个答案:

答案 0 :(得分:1)

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

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

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

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