MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB Count() vs. Aggregation

.count() ist um Längen schneller. Sie können die Implementierung sehen, indem Sie

aufrufen
// 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