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

MongoDB MapReduce-Update an Ort und Stelle, wie es geht

Sie können dies auf jeden Fall tun. Ich werde Ihre Fragen nacheinander beantworten:

1.Sie können zusammen mit Ihrer Map-Reduzierung eine Abfrage spezifizieren, die den Satz von Objekten filtert, die in die Map-Phase geleitet werden. In der Mongo-Shell würde dies so aussehen (unter der Annahme, dass m und r sind die Namen Ihrer Mapper- bzw. Reducer-Funktionen):

> db.coll.mapReduce(m, r, {query: {$or: [{"recently-voted": true}, {"hourly-score": {$gt: 0}}]}})

2. In Schritt 1 können Sie Ihren Mapper für alle Dokumente mit mindestens einer Stimme in der letzten Stunde (oder mit recently-voted) verwenden auf true gesetzt), aber nicht alle Stimmen wurden in der letzten Stunde abgegeben. Sie müssen also die Liste in Ihrem Mapper filtern und nur die Stimmen abgeben, die Sie zählen möchten:

function m() {
  var hour_ago = new Date() - 3600000;
  this.votes.forEach(function (vote) {
    if (vote.ts > hour_ago) {
      emit(/* your key */, this.vote.a);
    }
  });
}

Und zum Reduzieren:

function r(key, values) {
  var sum = 0;
  values.forEach(function(value) { sum += value; });
  return sum;
}

3.Um die Tabelle der Stundenergebnisse zu aktualisieren, können Sie reduceOutput verwenden Option zu map-reduce, die Ihren Reducer sowohl mit den ausgegebenen Werten als auch mit dem zuvor gespeicherten Wert in der Ausgabesammlung (falls vorhanden) aufruft. Das Ergebnis dieses Durchgangs wird in der Ausgabesammlung gespeichert. Das sieht so aus:

> db.coll.mapReduce(m, r, {query: ..., out: {reduce: "output_coll"}})

Zusätzlich zur erneuten Reduzierung der Ausgabe können Sie merge verwenden wodurch Dokumente in der Ausgabesammlung mit neu erstellten überschrieben werden (aber alle Dokumente mit einer _id zurücklassen anders als die _id s von Ihrem m-r-Job erstellt), replace , was effektiv ein Drop-and-Create-Vorgang ist und der Standardwert ist, oder verwenden Sie {inline: 1} , die die Ergebnisse direkt an die Shell oder an Ihren Treiber zurückgibt. Beachten Sie, dass bei Verwendung von {inline: 1} , müssen Ihre Ergebnisse in die Größe passen, die für ein einzelnes Dokument zulässig ist (16 MB in neueren MongoDB-Versionen).

(4.) Sie können Map-Reduce-Jobs auf Secondaries ("Slaves") ausführen, aber da Secondaries keine Schreibvorgänge akzeptieren können (das macht sie sekundär), können Sie dies nur tun, wenn Sie die Inline-Ausgabe verwenden.