.count()
ist um Längen schneller. Sie können die Implementierung sehen, indem Sie
// Note the missing parentheses at the end
db.collection.count
die die Länge des Cursors zurückgibt. der Standardabfrage (wenn count()
wird ohne Abfragedokument aufgerufen), was wiederum so implementiert ist, dass es die Länge der _id_
zurückgibt index, iirc.
Eine Aggregation hingegen liest jedes einzelne Dokument und verarbeitet es. Das kann bei .count()
nur halb so groß sein wenn es nur um einige 100.000 Dokumente geht (Geben und Nehmen entsprechend Ihrem RAM).
Die folgende Funktion wurde auf eine Sammlung mit etwa 12 Millionen Einträgen angewendet:
function checkSpeed(col,iterations){
// Get the collection
var collectionUnderTest = db[col];
// The collection we are writing our stats to
var stats = db[col+'STATS']
// remove old stats
stats.remove({})
// Prevent allocation in loop
var start = new Date().getTime()
var duration = new Date().getTime()
print("Counting with count()")
for (var i = 1; i <= iterations; i++){
start = new Date().getTime();
var result = collectionUnderTest.count()
duration = new Date().getTime() - start
stats.insert({"type":"count","pass":i,"duration":duration,"count":result})
}
print("Counting with aggregation")
for(var j = 1; j <= iterations; j++){
start = new Date().getTime()
var doc = collectionUnderTest.aggregate([{ $group:{_id: null, count:{ $sum: 1 } } }])
duration = new Date().getTime() - start
stats.insert({"type":"aggregation", "pass":j, "duration": duration,"count":doc.count})
}
var averages = stats.aggregate([
{$group:{_id:"$type","average":{"$avg":"$duration"}}}
])
return averages
}
Und zurückgegeben:
{ "_id" : "aggregation", "average" : 43828.8 }
{ "_id" : "count", "average" : 0.6 }
Die Einheit ist Millisekunden.
hth