MongoDB在数组的每个对象中设置键

时间:2018-09-18 04:28:21

标签: mongodb mongodb-update

我想确保数组中只有一个项目被标记为“当前”。所以我的想法是,如果传入的数据标记为“ current = true”,那么我想将所有其他项目更改为“ current = false”。

数据如下:

{
    _id:123,
    name:"bob jones",
    schools:[
        {
          name: "central HS",
          current: false
        },
        {
           name: "east side HS",
           current: true
        }
    ]
}

因此,如果我要添加一所学校-我想确保将现有学校标记为当前学校:false-仅当即将入学的学校被标记为当前学校时:

传入对象看起来像这样:

{
    name: "Discipline Military Academy HS",
    current: true
}

这是我尝试使用的代码。我没有收到任何错误-但是,当前为true的现有学校仍然保留,没有任何变化。所以它似乎不起作用

注意:传入的ID是该人的_id(_id:123)

module.exports.addSchool = function( id, data, callback ) {

    // reset all the other "currents" to false (only ONE current school permitted)
    if ( typeof data.current != 'undefined' && data.current === true ) {
        // NOTE:  a console.log('here'); shows I'm getting past the conditional... 
        User.update( {_id: id}, {$set: {'schools.0.current': false}} );
    }

    User.findByIdAndUpdate( id, { 
        $addToSet: {
            "schools": data
        }
    }, {new: true}, callback );

}

有什么建议吗?

注意:我正在使用mongoose 5.2.13将我的express应用程序连接到mongoDB,但确实收到此警告-(node:14508)DeprecationWarning:不推荐使用collection.findAndModify。改用findOneAndUpdate,findOneAndReplace或findOneAndDelete。

但是我不使用“ findAndModify”-所以我不认为这适用,尽管我很好奇它为什么显示。

1 个答案:

答案 0 :(得分:0)

用于将current : true更新为current:false

请更改查询。

 db.getCollection('user').update( {
    "_id" : id,
    "schools.current": true }, 
    {$set: {'schools.$.current': false}});