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

hvordan man beregner antal og unikke tal over to felter i mongo reducere funktion

Du kan faktisk sende et vilkårligt objekt på den anden parameter i emit-kaldet. Det betyder, at du kan drage fordel af dette og gemme bruger-id'et i det. For eksempel kan din kortfunktion se sådan ud:

var mapFunc = function() {
  if (this.track_redirect) {
    var tempDoc = {};
    tempDoc[this.track_userid] = 1;

    emit(this.track_redirect, {
      users_clicked: tempDoc,
      total_clicks: 1
    });
  }
};

Og din reduktionsfunktion kan se sådan ud:

var reduceFunc = function(key, values) {
  var summary = {
    users_clicked: {},
    total_clicks: 0
  };

  values.forEach(function (doc) {
    summary.total_clicks += doc.total_clicks;
    // Merge the properties of 2 objects together
    // (and these are actually the userids)
    Object.extend(summary.users_clicked, doc.users_clicked);
  });

  return summary;
};

Egenskaben users_clicked for resuméobjektet gemmer grundlæggende id'et for hver bruger som en egenskab (da du ikke kan have duplikerede egenskaber, kan du garantere, at den gemmer unikke brugere). Bemærk også, at du skal være forsigtig med, at nogle af de værdier, der sendes til reduceringsfunktionen, kan være resultatet af en tidligere reducering, og eksempelkoden ovenfor tager højde for det. Du kan finde mere om den nævnte adfærd i dokumenterne her .

For at få den unikke optælling, kan du gå ind i finalizer-funktionen, der kaldes, når reduktionsfasen er afsluttet:

var finalFunc = function(key, value) {
  // Counts the keys of an object. Taken from:
  // http://stackoverflow.com/questions/18912/how-to-find-keys-of-a-hash
  var countKeys = function(obj) {
    var count = 0;

    for(var i in obj) {
      if (obj.hasOwnProperty(i))
      {
        count++;
      }
    }

    return count;
  };

  return {
    redirect: key,
    total_clicks: value.total_clicks,
    unique_clicks: countKeys(value.users_clicked)
  };
};

Til sidst kan du udføre kortreduktionsjobbet som dette (rediger ud-attributten, så den passer til dine behov):

db.users.mapReduce(mapFunc, reduceFunc, { finalize: finalFunc, out: { inline: 1 }});



  1. Kan jeg gøre to kolonner unikke for hinanden? eller bruge sammensatte primære nøgler i redis?

  2. Kan ikke oprette forbindelse til Mongo DB via Spark

  3. Mongoose (mongodb) batchindlæg?

  4. Hvordan kører man hukommelsesanalyse på AWS ElastiCache?