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

MongoDB select count(distinct x) na indeksowanej kolumnie — zliczanie unikalnych wyników dla dużych zbiorów danych

1) Najłatwiej to zrobić za pomocą struktury agregacji. Wymaga to dwóch poleceń "$group":pierwsze grupuje według różnych wartości, drugie zlicza wszystkie różne wartości

pipeline = [ 
    { $group: { _id: "$myIndexedNonUniqueField"}  },
    { $group: { _id: 1, count: { $sum: 1 } } }
];

//
// Run the aggregation command
//
R = db.runCommand( 
    {
    "aggregate": "myCollection" , 
    "pipeline": pipeline
    }
);
printjson(R);

2) Jeśli chcesz to zrobić za pomocą Map/Reduce, możesz. Jest to również proces dwufazowy:w pierwszej fazie budujemy nową kolekcję z listą wszystkich odrębnych wartości klucza. W drugim wykonujemy count() w nowej kolekcji.

var SOURCE = db.myCollection;
var DEST = db.distinct
DEST.drop();


map = function() {
  emit( this.myIndexedNonUniqueField , {count: 1});
}

reduce = function(key, values) {
  var count = 0;

  values.forEach(function(v) {
    count += v['count'];        // count each distinct value for lagniappe
  });

  return {count: count};
};

//
// run map/reduce
//
res = SOURCE.mapReduce( map, reduce, 
    { out: 'distinct', 
     verbose: true
    }
    );

print( "distinct count= " + res.counts.output );
print( "distinct count=", DEST.count() );

Pamiętaj, że nie możesz zwrócić wyniku mapy/redukcji w wierszu, ponieważ potencjalnie przekroczy to limit rozmiaru dokumentu 16 MB. możesz zapisz obliczenia w kolekcji, a następnie count() rozmiar kolekcji lub możesz uzyskać liczbę wyników z wartości zwracanej przez mapReduce().



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Błąd:dokument operacji aktualizacji musi zawierać operatory atomowe podczas uruchamiania updateOne

  2. Porównanie mangusty _id i strings

  3. Jak połączyć się z mongodb za pomocą node.js (i uwierzytelnić)?

  4. Uzyskaj podzbiór tablicy w mongodb za pomocą źródła tablicy

  5. MongoDB $cosh