.count()
はるかに高速です。呼び出して実装を確認できます
// Note the missing parentheses at the end
db.collection.count
カーソルの長さを返します。デフォルトのクエリの(count()
の場合 クエリドキュメントなしで呼び出されます)。これは、_id_
の長さを返すものとして実装されます。 インデックス、iirc。
ただし、アグリゲーションはすべてのドキュメントを読み取り、それを処理します。これは、.count()
を使用した場合と同じ桁数の半分になります。 わずか10万件のドキュメントでそれを行う場合(RAMに応じて与えてください)。
以下の関数は、いくつかの1200万エントリのコレクションに適用されました:
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