MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisieren Sie ein untergeordnetes MongoDB-Dokument, wenn das übergeordnete Dokument möglicherweise nicht vorhanden ist

Sie haben grundsätzlich 3 Fälle:

  1. Sowohl das Buch als auch die Rezension existieren. Dies ist ein einfaches $set
  2. Das Buch existiert, aber nicht die Rezension. Dazu ist ein $push erforderlich
  3. Das Buch existiert nicht. Dies erfordert {upsert:1} und ein $setOnInsert

Ich konnte keinen Weg finden, zwei davon zu vereinheitlichen, ohne die Datenintegrität im Falle eines Fehlers zu gefährden (denken Sie daran, dass MongoDB keine atomare Transaktion hat).

Also mein Die beste Idee ist die folgende:

// Case 1:
db.books.update({isbn:'1234567890',
                 review: { $elemMatch: {userID: '01234'}}},
                {$set: {'review.$.rating': NEW_RATING}}
               )

// Case 2:
db.books.update({isbn:'1234567890',
                 review: { $not: { $elemMatch: {userID: '01234'}}}},
                {$push: {review: {rating: NEW_RATING, userID:'01234'}}}
               )

// Case 3:
db.books.update({isbn:'1234567890'},
                {$setOnInsert: {review: [{rating: NEW_RATING, userID:'01234'}]}},
                {upsert:1}
               )

Sie können diese drei Updates blind hintereinander ausführen, da es zwischen ihnen keinen überlappenden Fall gibt. Das Schöne an der Sache ist, dass all diese Operationen idempotent sind . Sie können sie also einmal oder mehrmals anwenden und erhalten immer das gleiche Ergebnis. Dies ist besonders wichtig bei einem Failover. Darüber hinaus gibt es keine Möglichkeit, dass Ihre Datenbank inkonsistent ist oder vorhanden verloren geht Daten im Fehlerfall. Im schlimmsten Fall ist die Bewertung nicht Aktualisiert. Schließlich sollte dies Gewährleistung der Datenkonsistenz auch bei gleichzeitigen Updates (d. h.:In diesem Fall überschreibt ein Update das andere, aber Sie sollten nicht am Ende zwei Dokumente für dasselbe Buch oder zwei Rezensionen desselben Benutzers für dasselbe Buch haben).
Dieser spätere Punkt muss bestätigt werden, da es hier spät ist, so dass meine Analyse etwas zweifelhaft sein könnte.

Als letzte Anmerkung:Wenn Sie die Anzahl der Roundtrips zwischen MongoDB und Ihrer App reduzieren möchten, können Sie einen Blick auf update Datenbankbefehl So können Sie mehrere Updates in einem Befehl zusammenfassen.