sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB, MapReduce och sortering

För det första är Mongo map/reduce inte designade för att användas som ett frågeverktyg (som det är i CouchDB), det är designat för dig att köra bakgrundsuppgifter. Jag använder den på jobbet för att analysera trafikdata.

Vad du däremot gör fel är att du använder sort() på din inmatning, men det är värdelöst eftersom när map() steget är klart de mellanliggande dokumenten sorteras efter varje keys . Eftersom din nyckel är ett dokument, sorteras den efter product_id , popularity .

Så här genererade jag min datauppsättning

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

Och detta är min karta/minska uppgift:

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

Och det här är slutresultatet (mycket lång tid att klistra in det här):

http://cesarodas.com/results.txt

Detta fungerar eftersom vi nu sorterar efter sorting, product_id, popularity . Du kan leka med sorteringen hur du vill, bara kom ihåg att den slutliga sorteringen sker med keys oavsett hur din input är sorterad.

Hur som helst som jag sa tidigare bör du undvika att göra frågor med Map/Reduce det var designat för bakgrundsbearbetning. Om jag var du skulle jag designa min data på ett sådant sätt att jag kunde komma åt den med enkla frågor, det finns alltid en avvägning i det här fallet komplex infogning/uppdateringar för att ha enkla frågor (det är så jag ser MongoDB).



  1. Redis py:när ska man använda anslutningspoolen?

  2. mongodb markör-id inte giltigt fel

  3. Hur man ställer in en Docker redis-behållare med ssl

  4. MongoDB $or fråga