sql >> データベース >  >> NoSQL >> MongoDB

埋め込み配列オブジェクトが変更されたときにMongooseインスタンス.save()が機能しない

    問題は、マングースがアレイが変更されていることを認識していないことです。

    2つのソリューションを使用できます:

    markModified

    この関数 埋め込まれた要素を変更済みとしてマークし、強制的に再保存します。マングースにこの要素を再保存するように指示します。

    User.findById(userID).exec(function (err, doc) {
            let cardInfo = req.cardInfo
            let cardIndex = req.cardIndex
            doc["cards"][0] = cardInfo;
            console.log(doc)
    /*  here I got right doc object as I requested
    {
            "_id": "59f3bdd488f912234fcf06ab",
            "email": "[email protected]",
            "username": "test",
            "__v": 2,
            "cards": [
                {
                    "testNo": "42424242424242"
                }
            ]
        }
    */
            doc.markModified('cards');
            doc.save(function (err) {
              if (err) {
                return res.json({
                  success: false,
                  msg: 'Card add error'
                });
              }
              res.json({
                success: true,
                msg: 'Successful updated card.'
              });
            });
    })
    

    完全なスキーマを使用します。

    markModifiedのトリックを回避するには、スキーマ内のカードの内容を記述する必要があります。このようにして、マングースはフィールドを保存する必要があるかどうかを判断できます。

    スキーマを適切に宣言する方法は次のとおりです:

    const CardSchema = new Schema({
      testNo: String,
    });
    
    var UserSchema = new Schema({
        username: {
            type: String,
            unique: true,
            required: true
        },
        email: {
            type: String,
            unique: true,
            required: true
        },
        cards: [CardSchema]
    });
    module.exports = mongoose.model('User', UserSchema);
    

    このようにして、マングースはカード内の値が変更されたかどうかを検出し、変更されたアイテムのみを保存することができます。

    実行できる場合(静的スキーマ)、これは明らかにそれを実行するための良い方法です。



    1. ラムダ関数を使用してリスト/配列内の一致する文字を持つ文字列を見つける方法は?

    2. 現在利用可能:AWSで完全にホストされたMongoDBインスタンス

    3. MongoDB:パスで見つかった位置(つまり'$')要素が多すぎます

    4. Redis、pubsubイベントをリッスンし、より信頼性の高い消費のためにそれらをストリームに変換します