sql >> データベース >  >> NoSQL >> MongoDB

MongoDB Count()と集計

    .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




    1. MongoDBのコレクション内のレコードのパーティション化

    2. 解析サーバーのインストールで「MongoErrorwriteEPIPE」

    3. Ubuntu11.04でmongodbを再起動できません

    4. Mongodbに文字列として保存された日付を処理するにはどうすればよいですか?