.count()
adalah jauh lebih cepat. Anda dapat melihat implementasinya dengan memanggil
// Note the missing parentheses at the end
db.collection.count
yang mengembalikan panjang kursor. dari kueri default (jika count()
dipanggil tanpa dokumen kueri), yang pada gilirannya diimplementasikan sebagai mengembalikan panjang _id_
indeks, iirc.
Namun, agregasi membaca setiap dokumen dan memprosesnya. Ini hanya bisa setengah jalan dalam urutan besarnya yang sama dengan .count()
ketika melakukannya hanya untuk beberapa 100k dokumen (memberi dan menerima sesuai dengan RAM Anda).
Fungsi di bawah ini diterapkan ke koleksi dengan beberapa entri 12 juta:
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
}
Dan kembali:
{ "_id" : "aggregation", "average" : 43828.8 }
{ "_id" : "count", "average" : 0.6 }
Satuannya adalah milidetik.
hth