0

配列内の 1 つの項目のみが「現在」としてマークされていることを確認したい。したがって、私の考えでは、着信データが「current = true」とマークされている場合、他のすべての項目を「current = false」に変更したいと考えています。

データは次のようになります。

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

したがって、学校を追加する場合は、既存の学校が current: false としてマークされていることを確認したいと思います。新しい学校が current: true とマークされている場合のみです。

着信オブジェクトは次のようになります。

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

これが私が使用しようとしているコードです。エラーは発生しませんが、current=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 を使用して高速アプリを mongoDB に接続していますが、この警告が表示されます - (node:14508) DeprecationWarning: collection.findAndModify is deprecated. 代わりに、findOneAndUpdate、findOneAndReplace、または findOneAndDelete を使用してください。

しかし、私は「findAndModify」を使用していないので、これが当てはまるとは思いませんが、なぜ表示されるのか興味があります。

4

1 に答える 1

0

への更新current : trueについてcurrent:false

クエリを変更してください。

 db.getCollection('user').update( {
    "_id" : id,
    "schools.current": true }, 
    {$set: {'schools.$.current': false}});
于 2018-09-18T05:47:32.410 に答える