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

MongoDB, MapReduce a řazení

Za prvé, Mongo map/reduce nejsou navrženy pro použití jako dotazovací nástroj (jako je tomu v CouchDB), jsou určeny pro spouštění úloh na pozadí. Používám jej v práci k analýze údajů o provozu.

Děláte však špatně, že na svůj vstup aplikujete sort(), ale je to zbytečné, protože když map() fáze je dokončena, přechodné dokumenty jsou seřazeny podle jednotlivých keys . Protože váš klíč je dokument, je řazen podle product_id , popularity .

Takto jsem vygeneroval svou datovou sadu

function generate_dummy_data() {
    for (i=2; i < 1000000; i++) { 
        db.foobar.save({
          _id: i, 
         category_id: parseInt(Math.random() * 30), 
         popularity:    parseInt(Math.random() * 50)
        }) 
    }
}

A toto je můj úkol zmapovat/zmenšit:

var data = db.runCommand({
  'mapreduce': 'foobar',
  'map': function() {
    emit({
      sorting: this.popularity * -1,
      product_id: this._id,
      popularity: this.popularity,
    }, 1);
  },
  'reduce': function(key, values) {
    var sum = 0;
    values.forEach(function(v) {
      sum += v;
    });

    return sum;  
  },
  'query': {category_id: 20},
  'out': {inline: 1},
});

A toto je konečný výsledek (je to velmi dlouhé na vložení):

http://cesarodas.com/results.txt

Funguje to, protože nyní třídíme podle sorting, product_id, popularity . S řazením si můžete hrát, jak chcete, nezapomeňte, že konečné řazení je pomocí key bez ohledu na to, jak je váš vstup seřazen.

Každopádně, jak jsem řekl dříve, měli byste se vyhnout provádění dotazů pomocí Map/Reduce, byl navržen pro zpracování na pozadí. Být vámi, navrhl bych svá data tak, abych k nim mohl přistupovat pomocí jednoduchých dotazů, v tomto případě je vždy kompromisem složité vkládání/aktualizace za jednoduché dotazy (takto vidím MongoDB).



  1. Nelze skenovat pomocí šablony redis

  2. Mongo hromadně najít a aktualizovat pole shodných dokumentů v jediném dotazu?

  3. Úrovně nejistoty MongoDB a jak se jim vyhnout

  4. MongoDB $dayOfWeek