MongoDB, bedingte upserts oder updates

Bei der Verwendung von MongoDB ich bin derzeit dabei einen bedingten upsert als Teil einer aggregation-Prozess auf die form (vereinfachte alot):

db.dbname.update({attr1 : value1, attr2 : value2},
                 {"$inc" : { avg : current_value, nr : 1}},
                 false (multi), true (upsert))

Aber ich möchte in der Lage, eine maximale (und minimal -) Wert als auch, ohne zum abrufen des Dokuments. Etwas entlang der Linien von:

db.dbname.update({ attr1 : value1, attr2 : value2},
                 {"$inc" : { avg : current_value, nr : 1},
                  "$setIfBigger" : { max : current_value}},
                 false (multi), true (upsert))

Ist das möglich in einer effizienten Weise?

Meine aktuelle, äußerst ineffizient, Lösung ist, dass ich prüfen, ob eine aktuelle aggregation Dokument, und wenn es vorhanden ist, aktualisiere ich die Werte entsprechend an, und wenn nicht ich ein neues Dokument erstellen. Beispiel (wieder vereinfacht eine Menge, aber die Essenz ist da):

var obj = db.dbname.findOne({attr1 : value1, attr2 : value2},{_id:1});
if (obj != null) {
   db.dbname.update({attr1 : value1, attr2 : value2},
                    {"$inc" : { avg : current_value, nr : 1},
                     "$set" : { max : (obj.max > current_value ? obj.max : current_value}},
                    false (multi), true (upsert));
} else {
   db.dbname.save({attr1 : value1, attr2 : value2, 
                   avg : current_value, nr : 1,
                   max : current_value});
}

Das eigentliche Programm ist in Java geschrieben und verwendet die mongo-API, und die aggregation Prozess ist sehr Komplex und verwendet Kompositionstechniken Weg über Javascript für die Kommunikation mit anderen Servern, ergo mapreduce ist keine option. Schließlich das Endergebnis ist durchaus ein gigantischer einfache Werte, die ich speichern möchten, in der möglichst effiziente Weise und auch zur Speicherung von vorberechneten Mittelwerte, Maxima und minima bestimmter Kombinationen.

Einer Lösung ist die Erstellung von einzigartigen Funktion-Objekte in JS für jedes einzelne update, was ich glaube, ist nicht eine effiziente Möglichkeit?

Das Hauptziel ist die Verringerung der Zeitdauer für die Durchführung einer aggregation dieser Art, die Bandbreite ist zweitrangig.

InformationsquelleAutor flindeberg | 2011-04-04

Schreibe einen Kommentar