web-dev-qa-db-ja.com

Mongooseで配列値を更新する方法

配列値を更新したいのですが、適切な方法がわからないため、次の方法を試しましたが、うまくいきませんでした。

私のモデル、私のモデルの子供フィールド

   childrens: {
       type: Array,
       default: ''
  }

私の質問、

   Employeehierarchy.update({ _id: employeeparent._id} ,{ $set: {"$Push": { "childrens": employee._id }} })
   .exec(function (err, managerparent) {});

誰でも助けてくれますか?.

7
MMR

_$set__$Push_ネストされた演算子と同じ更新式内。

更新演算子 を使用するための正しい構文は次のとおりです。

_{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}
_

ここで、_<operator1>, <operator2>_は here で指定された任意の更新演算子リストから取得できます。

配列に新しい要素を追加するには、単一の_$Push_演算子で十分です。 findByIdAndUpdateupdateメソッドを使用して、変更されたドキュメントを

_Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { "$Push": { "childrens": employee._id } },
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);
_

元のupdate()メソッドを使用すると、構文は

_Employeehierarchy.update(
   { "_id": employeeparent._id},
   { "$Push": { "childrens": employee._id } },
   function (err, raw) {
       if (err) return handleError(err);
       console.log('The raw response from Mongo was ', raw);
   }
);
_

コールバック関数が引数_(err, raw)_を受け取る場所

  • errは、発生した場合のエラーです
  • rawはMongoからの完全な応答です

変更されたドキュメントをチェックするため、findByIdAndUpdate関数を使用することをお勧めしますupdate()メソッドは変更されたドキュメントではなく、mongoからの完全な書き込み結果を提供します。


ドキュメント内のフィールドを更新し、同時に要素を配列に追加する場合は、次の操作を実行できます。

_Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { 
        "$set": { "name": "foo" },
        "$Push": { "childrens": employee._id } 
    } 
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);
_

上記はnameフィールドを「foo」に更新し、従業員IDをchildrens配列に追加します。

18
chridam

これに従うことができます

childrensに文字列値が含まれる場合、モデルは次のようになります。

childrens: [{
    type : String
}]

childrensに別のコレクション_idのObjectId値が含まれていて、設定する場合、モデルは次のようになります。

childrens: [{
    type : mongoose.Schema.Types.ObjectId,
    ref: 'refModelName'
}]

$setを使用する必要はありません。$Pushを使用してchildrens配列に値を挿入します。クエリは次のようになります:

Employeehierarchy.update(
   { _id: employeeparent._id},
   {"$Push": { "childrens": employee._id } }
 ).exec(function (err, managerparent) {
    //
 });
2
Shaishab Roy

これは私が推測するのに役立ちます

Employeehierarchy.findOneAndUpdate(
  { _id:employeeparent._id },
  { $set: { "childrens": employee._id }}
)
1
Deeksha Sharma