.count()
е много по-бързо. Можете да видите изпълнението, като се обадите на
// Note the missing parentheses at the end
db.collection.count
който връща дължината на курсора. на заявката по подразбиране (ако count()
се извиква без документ за заявка), което от своя страна се реализира като връщане на дължината на _id_
индекс, iirc.
Агрегирането обаче чете всеки един документ и го обработва. Това може да бъде само наполовина в същия порядък с .count()
когато го правите само върху около 100 000 документа (вземете и вземете според вашата RAM памет).
Функцията по-долу беше приложена към колекция с около 12 милиона записа:
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
}
И върна:
{ "_id" : "aggregation", "average" : 43828.8 }
{ "_id" : "count", "average" : 0.6 }
Единицата е милисекунди.
hth