sql >> Databáze >  >> NoSQL >> MongoDB

Aktualizujte vnořený dokument MongoDB, pokud nadřazený dokument nemusí existovat

V zásadě máte 3 případy:

  1. kniha i recenze existují. Toto je jednoduchý $set
  2. kniha existuje, ale ne recenze. To vyžaduje $push
  3. kniha neexistuje. Tato potřeba {upsert:1} a $setOnInsert

Nebyl jsem schopen najít způsob, jak sjednotit žádné dva z nich, aniž by došlo k ohrožení integrity dat v případě selhání (nezapomeňte, že MongoDB nemá atomickou transakci).

Takže moje nejlepší nápad je následující:

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

Tyto tři aktualizace můžete spouštět slepě, protože mezi nimi neexistuje žádný překrývající se případ. Krása věci spočívá v tom, že všechny tyto operace jsou idempotentní . Můžete je tedy aplikovat jednou nebo vícekrát a vždy získáte stejný výsledek. To je důležité zejména v případě převzetí služeb při selhání. Navíc neexistuje žádný způsob, jak by vaše DB byla nekonzistentní nebo ztratit existující data v případě poruchy. V nejhorším případě recenze není aktualizováno. Nakonec to mělo by zaručit konzistenci dat i v případě souběžných aktualizací (tj.:v takovém případě jedna aktualizace přepíše druhou, ale neměli byste mít dva dokumenty pro stejnou knihu nebo dvě recenze stejného uživatele pro stejnou knihu).
Tento pozdější bod musí být potvrzen, protože je zde pozdě, takže moje analýza může být poněkud pochybná.

Poslední poznámkou je, že pokud chcete snížit počet zpátečních cest mezi MongoDB a vaší aplikací, můžete se podívat na update databázový příkaz což vám umožní zabalit několik aktualizací do jednoho příkazu.




  1. Redis – co, proč a jak používat Redis jako primární databázi

  2. Hromadné požití do Redis

  3. jak mít vztahy mnoho k mnoha v redis

  4. editace dílčích dokumentů N-N vztah v mongodb