sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB kortlægge/reducere over flere samlinger?

En reduktionsfunktion kan kaldes én gang med en tast og alle tilsvarende værdier (men kun hvis der er flere værdier for nøglen - den kaldes slet ikke, hvis der kun er 1 værdi for nøglen).

Det kan også kaldes flere gange, hver gang med en nøgle og kun en undergruppe af de tilsvarende værdier , og den foregående reducerer resultaterne for den nøgle. Dette scenarie kaldes en re-reducering . For at understøtte re-reducerer bør din reduktionsfunktion være idempotent.

Der er to nøglefunktioner i en idempotent reduktionsfunktion:

  • afkastværdien af reduceringsfunktionen skal være i samme format som værdierne det tager ind. Så hvis din reducere-funktion accepterer en række strenge, bør funktionen returnere en streng. Hvis den accepterer objekter med flere egenskaber, bør den returnere et objekt, der indeholder de samme egenskaber. Dette sikrer, at funktionen ikke går i stykker, når den kaldes med resultatet af en tidligere reduktion.
  • Foretag ikke antagelser baseret på antallet af værdier det tager ind. Det er ikke garanteret, at values parameteren indeholder alle værdierne for den givne nøgle. Så ved at bruge values.length i beregninger er meget risikabelt og bør undgås.

Opdatering: De to trin nedenfor er ikke nødvendige (eller endda muligt, jeg har ikke tjekket) på de nyere MongoDB-udgivelser. Den kan nu håndtere disse trin for dig, hvis du angiver en outputsamling i kort-reducer-indstillingerne:

{ out: { reduce: "tempResult" } }

Hvis din reduktionsfunktion er idempotent, burde du ikke have nogen problemer med at kortreducere flere samlinger. Reducer blot resultaterne af hver samling:

Trin 1

Kør kort-reducer på hver påkrævet samling og gem resultaterne i en enkelt, midlertidig samling. Du kan gemme resultaterne ved hjælp af en færdiggørelsesfunktion:

finalize = function (key, value) {
  db.tempResult.save({ _id: key, value: value });
}

db.someCollection.mapReduce(map, reduce, { finalize: finalize })
db.anotherCollection.mapReduce(map, reduce, { finalize: finalize })

Trin 2

Kør endnu en kort-reducer på den midlertidige samling, ved brug af den samme reduktionsfunktion . Kortfunktionen er en simpel funktion, der vælger nøglerne og værdierne fra den midlertidige samling:

map = function () {
  emit(this._id, this.value);
}

db.tempResult.mapReduce(map, reduce)

Denne anden kort-reducering er dybest set en re-reducering og burde give dig de resultater, du har brug for.



  1. Mongodb indstilling unikt felt

  2. MongoDB $isNumber

  3. MongoDB $sum Aggregation Pipeline Operator

  4. Redisson, arbejdskø / dekø. Strategier for behandling af besked / element ved ufuldstændig beskedhåndtering ved nedlukning af system / pod