sql >> Database >  >> NoSQL >> MongoDB

MongoDB MapReduce-update op zijn plaats hoe?

Dit kun je zeker doen. Ik zal uw vragen een voor een beantwoorden:

1. U kunt samen met uw kaartverkleining een zoekopdracht specificeren, die de set objecten filtert die in de kaartfase worden doorgegeven. In de mongo-schaal zou dit er als volgt uitzien (ervan uitgaande dat m en r zijn de namen van respectievelijk uw mapper- en reducerfuncties):

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

2. Met stap #1 kunt u uw mapper gebruiken op alle documenten met ten minste één stem in het afgelopen uur (of met recently-voted ingesteld op true), maar niet alle stemmen zullen in het afgelopen uur zijn uitgebracht. U moet dus de lijst in uw mapper filteren en alleen die stemmen uitsturen die u wilt tellen:

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

En om te verminderen:

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

3.Om de uurscoretabel bij te werken, kunt u de reduceOutput . gebruiken optie om in kaart te brengen, die uw reductiemiddel aanroept met zowel de uitgezonden waarden als de eerder opgeslagen waarde in de uitvoerverzameling (indien aanwezig). Het resultaat van die pass wordt opgeslagen in de uitvoerverzameling. Dit ziet er als volgt uit:

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

Naast het opnieuw verminderen van de uitvoer, kunt u merge . gebruiken die documenten in de uitvoerverzameling zal overschrijven met nieuw aangemaakte (maar alle documenten met een _id achterlaat anders dan de _id s gemaakt door je m-r job), replace , wat in feite een drop-and-create-bewerking is en de standaard is, of gebruik {inline: 1} , waarmee de resultaten rechtstreeks naar de shell of naar uw stuurprogramma worden geretourneerd. Houd er rekening mee dat bij gebruik van {inline: 1} , moeten uw resultaten passen in de grootte die is toegestaan ​​voor een enkel document (16 MB in recente MongoDB-releases).

(4.)U kunt kaartverkleinende taken uitvoeren op secundairen ("slaves"), maar aangezien secundairen geen schrijfbewerkingen kunnen accepteren (dat is wat ze secundair maakt), kunt u dit alleen doen bij gebruik van inline-uitvoer.




  1. Wat is een goede MongoDB-documentstructuur voor de meest efficiënte bevraging van gebruikersvolgers/volgers?

  2. Ondersteunt Spring Data Redis (1.3.2.RELEASE) JedisSentinelPool van jedis?

  3. Recursieve elementen in Schema:Mongoose-modellering

  4. Mongoose/MongoDB resultaatvelden verschijnen ongedefinieerd in Javascript