.count()
nhanh hơn rất nhiều. Bạn có thể thấy việc triển khai bằng cách gọi
// Note the missing parentheses at the end
db.collection.count
trả về độ dài của con trỏ. của truy vấn mặc định (if count()
được gọi mà không có tài liệu truy vấn), đến lượt nó được triển khai dưới dạng trả về độ dài của _id_
chỉ mục, iirc.
Tuy nhiên, một tập hợp đọc từng tài liệu và xử lý nó. Đây chỉ có thể là một nửa theo cùng một thứ tự độ lớn với .count()
khi thực hiện nó chỉ hơn 100k tài liệu (cho và nhận tùy theo RAM của bạn).
Chức năng dưới đây đã được áp dụng cho một bộ sưu tập với một số mục nhập 12 triệu:
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
}
Và được trả lại:
{ "_id" : "aggregation", "average" : 43828.8 }
{ "_id" : "count", "average" : 0.6 }
Đơn vị là mili giây.
hth