MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Skutecznie zliczaj procent występowania w MongoDB

Oto prosty MapReduce które zrobią to, co chcesz:

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

Możesz też zrobić upsert w ten sposób, gdy wstawiasz do swojej głównej kolekcji, co daje wgląd w dane w czasie rzeczywistym:

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

W rzeczywistości możesz nawet połączyć te metody. Wykonaj jednorazowe zadanie wsadowe MapReduce, aby wypełnić kolekcję liczników, a następnie użyj upserts, aby zachować jej aktualność.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $push i $set w tej samej aktualizacji MongoDB

  2. Jak obsługiwać myślniki w definicjach schematu GraphQL

  3. Co jest nie tak z MongoDB usuwającym zapytanie za pomocą mongodb java dla podtablicy dokumentu?

  4. Jak wykorzystać zrzucone dane przez mongodump?

  5. środowisko wykonawcze korzystania z indeksowania w mongodb