MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mise à jour de MongoDB MapReduce en place comment

Vous pouvez certainement le faire. Je vais répondre à vos questions une par une :

1.Vous pouvez spécifier une requête avec votre map-reduce, qui filtre l'ensemble d'objets qui seront passés dans la phase de carte. Dans le shell mongo, cela ressemblerait à (en supposant que m et r sont respectivement les noms de vos fonctions de mappeur et de réducteur) :

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

2.L'étape 1 vous permettra d'utiliser votre mappeur sur tous les documents avec au moins un vote dans la dernière heure (ou avec recently-voted défini sur true), mais tous les votes n'auront pas eu lieu au cours de la dernière heure. Vous devrez donc filtrer la liste dans votre mappeur, et n'émettre que les votes que vous souhaitez compter :

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

Et pour réduire :

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

3.Pour mettre à jour le tableau des scores horaires, vous pouvez utiliser le reduceOutput option de map-reduce, qui appellera votre réducteur avec les valeurs émises et la valeur précédemment enregistrée dans la collection de sortie, (le cas échéant). Le résultat de cette passe sera enregistré dans la collection de sortie. Cela ressemble à :

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

En plus de réduire à nouveau la sortie, vous pouvez utiliser merge qui écrasera les documents dans la collection de sortie avec ceux nouvellement créés (mais en laissant derrière tous les documents avec un _id différent du _id s créé par votre travail m-r), replace , qui est en fait une opération de dépôt et de création et est la valeur par défaut, ou utilisez {inline: 1} , qui renverra les résultats directement au shell ou à votre pilote. Notez que lors de l'utilisation de {inline: 1} , vos résultats doivent tenir dans la taille autorisée pour un seul document (16 Mo dans les versions récentes de MongoDB).

(4.) Vous pouvez exécuter des travaux de réduction de carte sur des secondaires ("esclaves"), mais comme les secondaires ne peuvent pas accepter les écritures (c'est ce qui les rend secondaires), vous ne pouvez le faire que lorsque vous utilisez une sortie en ligne.