2016-10-26 5 views
0

Ich versuche, Objekte innerhalb eines Arrays in einem Dokument zu aktualisieren. Die Objekte sind keine Filialdokumente und haben daher keine eindeutige ID. Ich habe versucht, verschiedene Methoden zu suchen, um dies zu tun, aber es scheint nur keine Wirkung (wie in nichts passiert - keine Fehler, aber das Dokument wird nicht aktualisiert.Aktualisieren von Objekten in Array in MongoDB mit Mungo

Wahrscheinlich einfacher, nur um die zu zeigen . Code Zuerst, hier ist ein Beispiel für ein Dokument in dieser Sammlung:

{ 
    _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 
     } 
    ] 
} 

Und nun Abfrage meiner Mungo (innerhalb einer Schnellstraße):

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 
     } 
    }) 

ich auch dies mit $ Notation versucht habe in der $set Befehl dh 'submissions.$.assessorNotes': req.body.assessorComments', aber das scheint auch nicht zu funktionieren.

Wohin gehe ich falsch ?!

Prost!

Chris

+0

es sollte $ 'mit dem Positions Operator' arbeiten. Bist du sicher, dass du eine Übereinstimmung hast? Wenn Sie nur mit diesen Parametern "finden", finden Sie das Dokument? – TomG

+0

Ich habe versucht, einen 'find' auszuführen, und es hat das korrekte Dokument zurückgegeben, so dass es aussieht, als ob ich eine Übereinstimmung erhalte - es aktualisiert sich gerade nicht. Habe auch mit 'findOneAndUpdate' versucht - gleiches Problem – Chris

Antwort

2

Genau dies mit dem Positions Operator getestet, wie durch TomG in einer Schale oben erwähnt.

> 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 
     } 
    ] 
} 

Dann lief ich den Update-Befehl:

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

Ergebnisse sind wie folgt:

{ 
    "_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" 
     } 
    ] 
} 

Edit: Meine Vermutung ist, dass der Fehler auch mit dem Update in Mungo sein könnte, Sie könnten versuchen, sowohl die positionellen Operatoren zu ändern, als auch findOneAndUpdate zu verwenden, wenn es Ihren Bedürfnissen entspricht, anstatt es zu aktualisieren.

Bitte versuchen Sie diese Abfrage für Mongoose:

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

Habe gerade' findOneAndUpdate' ausprobiert und habe anscheinend das selbe Problem. Wenn ich einen "Fund" mache, wie Tom es vorgeschlagen hat, gibt es das richtige Dokument zurück, so dass es aussieht, als hätte ich eine Übereinstimmung. Gibt es noch eine Alternative zu 'update' und' findOneAndUpdate'? Vielleicht mit 'save' oder etwas ähnlichem? – Chris

+0

Sie könnten find/findOne verwenden, um Ihr Objekt im Callback zurückzugeben, dann den Wert ändern und schließlich die Sicherungsfunktion aufrufen. Verwenden Sie den Positionsoperator auch in Ihrem $ set? – dyouberg

+0

Ich habe eine Abfrage für Mongoose hinzugefügt, können Sie das bitte versuchen und sehen, ob es funktioniert? Ich habe am Ende des Set-Befehls eine fehlende Klammer entdeckt. – dyouberg

Verwandte Themen