sql >> Database >  >> NoSQL >> MongoDB

MongoDB Collection-update:initialiseer een document met standaardwaarden

Ik en mijn collega's hebben een oplossing gevonden. We kunnen het initialisatie in drie stappen noemen .

Onthoud dat MongoDB de atomiciteit van bewerkingen op één document garandeert. Met dit feit in gedachten kunnen we op de volgende manier werken:

  1. Probeer het document bij te werken, door de tellers op een bepaald tijdstip correct te verhogen. Doe geen upsert, gewoon een ouderwetse update-operatie. Onthoud dat de uitvoering van een update-instructie het aantal geschreven documenten retourneert. Als het aantal geschreven documenten groter is dan nul, bent u klaar.
  2. Als het aantal documenten dat door de update is geschreven nul is, betekent dit dat het relatieve document dat moet worden bijgewerkt nog niet in de collectie aanwezig is. Probeer het hele document voor de opgegeven tags in te voegen. Zet alle tellers (veldwaarden) op nul. Ook de uitvoering van een insert-statement retourneert het aantal geschreven documenten. Als het nul retourneert of een uitzondering genereert, maakt niet uit:het betekent dat een ander proces het document al voor dezelfde tags had ingevoegd.
  3. Voer dezelfde bovenstaande update opnieuw uit.

De code zou er ongeveer uit moeten zien als het volgende codefragment.

// Firt of all, try the update
var result = db.test.update(
  {timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"), type: “memory_used”},
  {$inc: {"values.39": 1}},
  {upsert: false}
);
// If the update do not succeed, then try to insert the document
if (result.nModified === 0) {
  try {
    db.test.insert(/* Put here the whole document */);
  } catch (err) {
    console.log(err);
  }
  // Here we are sure that the document exists.
  // Retry to execute the update statement
  db.test.update(/* Same update as above */);
}

De bovenstaande procedure werkt als een voorwaarde geldt:_id waarde moet worden afgeleid uit andere velden in het document. In ons voorbeeld _id waarde zou zijn '2013-10-10T23:06:00.000Z-memory_used . Alleen met deze techniek zal het invoegen bij punt 2 correct mislukken.




  1. Concat-arrays met PyMongo zijn mislukt met onbekende groepsoperator '$concatArrays'

  2. mangoest zoekt hetzelfde veld met verschillende waarden

  3. Waarde verlagen in mongodb

  4. Future of Hadoop - Salarissen en baanvoorspellingen in big data-analyse