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

インデックス付き列のMongoDBselectcount(distinct x)-大規模なデータセットの一意の結果をカウントします

    1)これを行う最も簡単な方法は、集約フレームワークを使用することです。これには2つの「$group」コマンドが必要です。最初のコマンドは個別の値でグループ化し、2番目のコマンドはすべての個別の値をカウントします

    pipeline = [ 
        { $group: { _id: "$myIndexedNonUniqueField"}  },
        { $group: { _id: 1, count: { $sum: 1 } } }
    ];
    
    //
    // Run the aggregation command
    //
    R = db.runCommand( 
        {
        "aggregate": "myCollection" , 
        "pipeline": pipeline
        }
    );
    printjson(R);
    

    2)Map / Reduceを使用してこれを実行する場合は、可能です。これも2フェーズのプロセスです。最初のフェーズでは、キーのすべての個別の値のリストを使用して新しいコレクションを作成します。 2番目では、新しいコレクションに対してcount()を実行します。

    var SOURCE = db.myCollection;
    var DEST = db.distinct
    DEST.drop();
    
    
    map = function() {
      emit( this.myIndexedNonUniqueField , {count: 1});
    }
    
    reduce = function(key, values) {
      var count = 0;
    
      values.forEach(function(v) {
        count += v['count'];        // count each distinct value for lagniappe
      });
    
      return {count: count};
    };
    
    //
    // run map/reduce
    //
    res = SOURCE.mapReduce( map, reduce, 
        { out: 'distinct', 
         verbose: true
        }
        );
    
    print( "distinct count= " + res.counts.output );
    print( "distinct count=", DEST.count() );
    

    map / reduceインラインの結果を返すことはできないことに注意してください。これは、16MBのドキュメントサイズ制限を超える可能性があるためです。 できます 計算をコレクションに保存してから、コレクションのサイズをcount()するか、mapReduce()の戻り値から結果の数を取得できます。



    1. MongoDBで特定の名前のインデックスを作成する方法

    2. 2つのmongodbコレクションを比較する方法は?

    3. ハウツー:ClouderaManagerを使用してClouderaSearchをクラスターに追加する

    4. アマゾンウェブサービスのDIYクラウドデータベース-新しいホワイトペーパー