2016-10-26 13 views
0

文書内の配列内のオブジェクトを更新しようとしています。オブジェクトはサブ文書ではないため、一意のIDを持ちません。私はこれを行うにはさまざまな方法を試してみましたが、何も起こりません(何も起こりません - エラーはありませんが、ドキュメントは更新されません)。MongooseでMongoDBの配列内のオブジェクトを更新する

おそらくもっと簡単に。(速達ルート内)

{ 
    _id: 123, 
    //other fields go here 
    submissions: [ 
     { 
      submission: 1, 
      downloaded: null, //This should be an ISODate when populated 
      assessor: null, //This should be an ObjectID when populated 
      feedbackUploaded: null, //This should also be an ISODate 
      path: '401Test1.doc', 
      assessorNotes: null //This should be a string when populated 
     }, 
     { 
      submission: 2, 
      downloaded: null, 
      assessor: null, 
      feedbackUploaded: null, 
      path: '401Test2.doc', 
      assessorNotes: null 
     } 
    ] 
} 

そして今、私のマングースクエリ:コードまず、ここでこのコレクション内のドキュメントの例です私もこの使用$表記法を試してみた

const unit = req.body.unit; //e.g. 123 
const submission = req.body.submission // e.g. 2 
const date = Date.now(); 

Unit.update({ "_id": unit, "submissions.submission": submission }, { 
     $set: { 
      'submissions.assessorNotes': req.body.assessorComments, 
      'submissions.feedbackUploaded': date, 
      'submissions.assessor': req.body.assessor 
     }, function(err){ 
      //callback 
     } 
    }) 

$setコマンド、つまり'submissions.$.assessorNotes': req.body.assessorComments'でも、これはうまくいかないようです。

どこが間違っていますか?

乾杯!クリス

+0

それは、位置演算子 '$'で動作するはずです。あなたは本当にマッチしていますか?これらのパラメータで 'find'するだけであれば、ドキュメントを見つけますか? – TomG

+0

'find'を実行しようとしたときに正しい文書が返されたので、一致しているように見えます。 'findOneAndUpdate'で試してみました - 同じ問題 – Chris

答えて

2

ちょうどシェル内TomGによって上記のような位置オペレータでこれをテストしました。

> db.foo.find().pretty() 
{ 
    "_id" : 123, 
    "submissions" : [ 
     { 
      "submission" : 1, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test1.doc", 
      "assessorNotes" : null 
     }, 
     { 
      "submission" : 2, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test2.doc", 
      "assessorNotes" : null 
     } 
    ] 
} 

は、それから私は、updateコマンドを実行した次のように

db.foo.update(
    { _id: 123, "submissions.submission": 2 }, 
    { $set: { 
    "submissions.$.assessorNotes": "testAssessorNotes", 
    "submissions.$.feedbackUploaded": new Date(), 
    "submissions.$.assessor": "testAssessor" 
    } } 
) 

結果は次のとおりです。

{ 
    "_id" : 123, 
    "submissions" : [ 
     { 
      "submission" : 1, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test1.doc", 
      "assessorNotes" : null 
     }, 
     { 
      "submission" : 2, 
      "downloaded" : null, 
      "assessor" : "testAssessor", 
      "feedbackUploaded" : ISODate("2016-10-26T15:33:09.573Z"), 
      "path" : "401Test2.doc", 
      "assessorNotes" : "testAssessorNotes" 
     } 
    ] 
} 

編集:私の勘では、エラーもマングースでの更新となり得ることで、ポジショニング演算子に変更するだけでなく、更新の代わりに必要に応じてfindOneAndUpdateを使用してみることもできます。

マングースのために、このクエリを試してください:

Unit.update(
    { "_id": unit, "submissions.submission": submission }, 
    { $set: { 
     'submissions.$.assessorNotes': req.body.assessorComments, 
     'submissions.$.feedbackUploaded': date, 
     'submissions.$.assessor': req.body.assessor 
    } }, function(err, result) { 
     //callback 
    } 
}); 
+0

' findOneAndUpdate'を試してみたところ、同じ問題があるようです。 Tomが提案したように 'find 'を実行すると、正しい文書が返されるので、一致したかのように見えます。 'update'と' findOneAndUpdate'には別の方法がありますか?おそらく、 'save'などを使っているでしょうか? – Chris

+0

find/findOneを使用してオブジェクトをコールバックに戻した後、値を変更して最後にsave関数を呼び出すことができます。あなたはあなたの$集合の位置演算子も使っていますか? – dyouberg

+0

Mongooseのクエリを追加しました。どうぞお試しください。私はあなたのセットコマンドの最後に欠けているブレースに気づいた。 – dyouberg

関連する問題