sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualización de MongoDB MapReduce en su lugar cómo

Definitivamente puedes hacer esto. Abordaré sus preguntas una a la vez:

1. Puede especificar una consulta junto con su map-reduce, que filtra el conjunto de objetos que pasarán a la fase de mapa. En el shell de mongo, esto se vería (suponiendo que m y r son los nombres de sus funciones mapeadora y reductora, respectivamente):

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

2. El paso n.º 1 le permitirá usar su mapeador en todos los documentos con al menos un voto en la última hora (o con recently-voted establecido en verdadero), pero no todos los votos habrán sido en la última hora. Por lo tanto, deberá filtrar la lista en su mapeador y emitir solo los votos que desea contar:

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

Y para reducir:

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

3. Para actualizar la tabla de puntajes por hora, puede usar reduceOutput opción de map-reduce, que llamará a su reductor con los valores emitidos y el valor guardado previamente en la colección de salida (si corresponde). El resultado de ese pase se guardará en la colección de salida. Esto se parece a:

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

Además de volver a reducir la salida, puede usar merge que sobrescribirá los documentos en la colección de salida con los recién creados (pero dejando atrás cualquier documento con un _id diferente al _id s creados por su trabajo m-r), replace , que es efectivamente una operación de colocar y crear y es la predeterminada, o use {inline: 1} , que devolverá los resultados directamente al shell o a su controlador. Tenga en cuenta que al usar {inline: 1} , sus resultados deben caber en el tamaño permitido para un solo documento (16 MB en versiones recientes de MongoDB).

(4.) Puede ejecutar trabajos de reducción de mapas en secundarios ("esclavos"), pero dado que los secundarios no pueden aceptar escrituras (eso es lo que los hace secundarios), solo puede hacer esto cuando usa la salida en línea.