更新Mongoose中嵌套对象的单个数组值

时间:2016-08-29 13:26:26

标签: node.js mongodb mongoose

我试图使用Mongoose更新数组中的值,我创建的表在下面给出

var newUser = User({
        name      : 'XXX',
        userName  : 'XXX',
        password  : 'XXX',
        admin     : true,
        location  : 'KKK',
        studentDeatails   : [
            {
                name  : 'AAA',
                study : {
                    dept   : 'CSE',
                    course : 'B.E',
                    year   : 4
                }
            },
            {
                name  : 'BBB',
                study : {
                    dept   : 'EEE',
                    course : 'B.E',
                    year   : 3
                }
            }
        ],
        createdAt: Date(),
        updatedAt: Date()
    });

结果

[ { _id: 57c42dd22842e7561e8b9612,
    name: 'XXX',
    userName: 'XXX',
    password: 'XXX',
    admin: true,
    location: 'KKK',
    createdAt: 2016-08-29T12:42:58.000Z,
    updatedAt: 2016-08-29T12:42:58.000Z,
    studentDeatails: [ { name: 'AAA',
    _id: 57c42dd22842e7561e8b9614,
    study: { dept: 'CSE', course: 'B.E', year: 4 } },
  { name: 'BBB',
    _id: 57c42dd22842e7561e8b9613,
    study: { dept: 'EEE', course: 'B.E', year: 3 } } ] } ]

我试图更新dept的值:'EEE' -> dept: 'MECH'

我的预期答案应该是:

[ { _id: 57c42dd22842e7561e8b9612,
    name: 'XXX',
    userName: 'XXX',
    password: 'XXX',
    admin: true,
    location: 'KKK',
    createdAt: 2016-08-29T12:42:58.000Z,
    updatedAt: 2016-08-29T12:42:58.000Z,
    studentDeatails: [ { name: 'AAA',
    _id: 57c42dd22842e7561e8b9614,
    study: { dept: 'CSE', course: 'B.E', year: 4 } },
  { name: 'BBB',
    _id: 57c42dd22842e7561e8b9613,
    study: { dept: 'MECH', course: 'B.E', year: 3 } } ] } ]

我尝试的代码是:

User.findOneAndUpdate(
    { name: 'XXX', 'studentDeatails.study.year': 3 },
    { "$set": { 'studentDeatails.0.study.$.dept' : 'MECH' } },
    function(err){
        if(err){
            console.log(err);
        } else {
            console.log("Successfully Updated");
        }
    }
);

请使用Mongoose纠正我做错的事情,这将是非常有帮助的!

1 个答案:

答案 0 :(得分:2)

由于study字段是子文档,因此无需应用位置 $ 运算符,因为它仅适用于数组中的嵌入文档。它应该应用于studentDeatails(原文如此)数组字段。所以你的更新应该只是:

User.findOneAndUpdate(
    { "name": "XXX", "studentDeatails.study.year": 3 },
    { "$set": { "studentDeatails.$.study.dept" : "MECH" } },
    function(err){
        if(err){
            console.log(err);
        } else {
            console.log("Successfully Updated");
        }
    }
);