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

MongoDB, MapReduce og sortering

Først og fremmest er Mongo map/reduce ikke designet til at blive brugt som et forespørgselsværktøj (som det er i CouchDB), det er designet til, at du kan køre baggrundsopgaver. Jeg bruger det på arbejdet til at analysere trafikdata.

Hvad du imidlertid gør forkert er, at du anvender sort() på dit input, men det er ubrugeligt, fordi når map() trin er udført, er mellemdokumenterne sorteret efter hver keys . Fordi din nøgle er et dokument, sorteres den efter product_id , popularity .

Sådan genererede jeg mit datasæt

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

Og dette er min kort/reducer opgave:

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

Og dette er slutresultatet (meget lang tid at indsætte det her):

http://cesarodas.com/results.txt

Dette virker, fordi vi nu sorterer efter sorting, product_id, popularity . Du kan lege med sorteringen, som du vil, bare husk, at den endelige sortering er efter keys uanset hvordan dit input er sorteret.

Alligevel som jeg sagde før, bør du undgå at lave forespørgsler med Map/Reduce, det var designet til baggrundsbehandling. Hvis jeg var dig, ville jeg designe mine data på en sådan måde, at jeg kunne få adgang til dem med simple forespørgsler, der er altid en afvejning i dette tilfælde kompleks indsættelse/opdateringer for at have simple forespørgsler (det er sådan jeg ser MongoDB).



  1. MongoDB atomic findOrCreate:findOne, indsæt hvis den ikke findes, men opdater ikke

  2. Redis udløb af tasterumsmeddelelse udløses ikke

  3. Hvordan gemmer man kun én database i Redis?

  4. Unicode i python