sql >> Databáze >  >> NoSQL >> MongoDB

jak vypočítat počet a jedinečný počet přes dvě pole ve funkci mongo snížení

Ve skutečnosti můžete předat libovolný objekt na druhém parametru volání emit. To znamená, že toho můžete využít a uložit do něj ID uživatele. Vaše mapová funkce může vypadat například takto:

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

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

A vaše funkce snížení může vypadat takto:

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;
};

Vlastnost users_clicked souhrnného objektu v podstatě ukládá id každého uživatele jako vlastnost (protože nemůžete mít duplicitní vlastnosti, můžete zaručit, že bude ukládat jedinečné uživatele). Všimněte si také, že si musíte dávat pozor na skutečnost, že některé hodnoty předané funkci snížení mohou být výsledkem předchozího snížení a výše uvedený ukázkový kód to bere v úvahu. Více o uvedeném chování naleznete v dokumentech zde .

Chcete-li získat jedinečný počet, můžete předat funkci finalizátoru, která se zavolá po dokončení fáze redukce:

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)
  };
};

Nakonec můžete provést úlohu zmenšení mapy takto (upravte atribut out tak, aby vyhovoval vašim potřebám):

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



  1. Mongod si stěžuje, že neexistuje složka /data/db

  2. Jak získám číslo verze MongoDB na Heroku?

  3. Jak třídit, vybírat a dotazovat vnořený dokument v mongoose

  4. Více dotazů uvnitř dotazu mongodb