MongoDB从数组值更新

时间:2018-03-27 10:50:38

标签: mongodb

数据。

{
"_id" : ObjectId("5aab67d9a0f7ef2e24860d09"),
"Name" : "Raj",
"status" : "pass",
"marks" : [ 
    {
        "M" : 95,
        "E" : 75,
        "H" : 60.0,
        "s" : "p"
    }, 
    {
        "M" : 56,
        "E" : 45,
        "H" : 60.0,
        "s" : "p"
    }
]

}

{
"_id" : ObjectId("5aab689ea0f7ef2e24860d0b"),
"Name" : "Amit",
"status" : "Fail",
"marks" : [ 
    {
        "M" : 95,
        "E" : 75,
        "H" : 55,
        "s" : "p"
    }, 
    {
        "M" : 56,
        "E" : 30,
        "H" : 95,
        "s" : "f"
    }
]

}

这是我在mongoDb中的集合结构

我想更新"状态"具有第二个对象值的字段" marks.s" 我试过了

db.getCollection('test').updateMany(
  { $set : {"status" : "marks.1.s" } }

错误

Error:

TypeError:无法将undefined转换为object: DBCollection.prototype.updateMany@src/mongo/shell/crud_api.js:594:16 @(壳):1:1

2 个答案:

答案 0 :(得分:0)

这将更新整个集合,从第二个位置获取s的值并在文档的status字段中进行设置。

db.test.aggregate([   
{ "$addFields": { "status": {$arrayElemAt:[ "$marks.s",1]} }} ,
{ "$out": "test" }
]);

答案 1 :(得分:0)

这对我来说很好:

db.test.find().snapshot().forEach(function (item) 
       {db.test.update({_id: item._id},{$set: {status: item.marks[1].s}})});

遍历整个集合,并为每个项目用其标记值替换状态值。