MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Ефективно преброяване на процента на възникване в MongoDB

Ето прост MapReduce който ще направи това, което искате:

map = function() {
    for (var key in this.values){
        emit(key, {count:1, trues: (this.values[key] ? 1 : 0)});
    }
}

reduce = function(key, values){
    var out = values[0];
    for (var i=1; i < values.length; i++){
        out.count += values[i].count;
        out.trues += values[i].trues;
    }
    return out;
}

finalize = function(key, value){
    value.ratio = value.trues / value.count;
    return value;
}

db.runCommand({mapReduce:'collection',
               map:map,
               reduce:reduce,
               finalize:finalize,
               out:'counts'
               })

db.counts.findOne({_id:'alpha'})
{_id: 'alpha', value: {count: 100, trues: 52, ratio: 0.52}}

Можете също да направите upsert като това, когато вмъкнете в основната си колекция, което ще ви даде преглед в реално време на вашите данни:

for (var key in this.values){
    db.counts.update({_id:key},
                     {$inc:{count:1, trues: (this.values[key] ? 1 : 0)}},
                     true);
}

Всъщност можете дори да комбинирате тези методи. Извършете еднократно групово задание на MapReduce, за да попълните колекцията от преброявания и след това използвайте upserts, за да я поддържате актуална.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Необходим съвет:Как правилно да свържете React към MongoDB

  2. mongoDB 32-битово ограничение от 2 GB, най-добри практики

  3. Как да получите този резултат с aggregate в mongoDB

  4. Какъв е правилният начин да направите синхронна заявка за MongoDB в Node.js?

  5. Запитване за масиви от вложени обекти