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

Mongo Map-SQLでcount(distinct(...))groupbyを模倣するように削減

    map-reduceソリューションを選択する代わりに、結果を簡単に集計できます。

    • Match 日付が指定された日付よりも大きいレコード。

    • Group brand_idに基づく フィールド。

    • $addToSet を使用します productsを維持するための演算子 一意のproduct_idのリスト グループごとに。

    • Project count productsの 各キーの配列。

    コード:

    db.collection.aggregate([
    {$match:{"date":{$gte:new Date('2014-11-20')}}},
    {$group:{"_id":"$brand_id","products":{$addToSet:"$product_id"}}},
    {$project:{"_id":0,"brand_id":"$_id","distinct_prod":{$size:"$products"}}}
    ])
    

    map-reduceソリューションに来てください

    これは、mongodbが各グループのreduce関数を呼び出す1つの方法です。 docs から :

    mapにいくつかの変更を加える必要があります 、reduce 関数を追加し、新しいfinalizeを追加します 機能:

    • mongodbの場合は、そのことを覚えておく必要があります reduceを呼び出します 同じキーの関数が複数回使用される場合、前回の呼び出しの結果は、次にreduce関数が呼び出されたときに、他の値とともに、reduce関数への入力として渡されます。
    • 最初のポイントです。したがって、reduce関数への入力とreduce関数からの戻り値が同様に構築されていることを確認する必要があります。これにより、reduce関数内に記述されたロジックが、以前の呼び出しでの独自の戻り値の処理に対応できるようになります。
    • バッチで呼び出された場合、個別の値の数を取得することはできないため、reduceを記述して実行できます。 個別のproduct_idsを蓄積する関数 キーごとにfinalizeを記述します それらの一意の値の数を計算する関数。

    コード:

    db.collection.mapReduce(
        function() {
            // emitting the same structure returned by the reduce function.
            emit(this.brand_id, {"prod_id":[this.product_id]});
        },
        function(key, values) {
           // the return value would be a list of unique product_ids.
            var res = {"prod_id":[]};
            for(var i=0;i<values.length;i++)
            {
             for(var j=0;j<values[i].prod_id.length;j++){
                if(res.prod_id.indexOf(values[i].prod_id[j]) == -1){
                    res.prod_id.push(values[i].prod_id[j]);
                }
            }}
            return res;
        },
        {
            query: {date: {$gte: new Date('2014-11-20')}},
            out: "example",
            finalize: function(key, reducedValue){
                // it returns just the count
                return reducedValue.prod_id.length;
            }
        }
    )
    



    1. Node.jsでMongooseを使用してMongoDBでドキュメントを検索するときの奇妙な応答

    2. ブラウザからmongodbにアクセスできない-ネイティブドライバポートでHTTP経由でMongoDBにアクセスしようとしているようです

    3. DjangoでMongoClientを保存する場所

    4. Mongodbで.aggregateを使用するfindOneと同等のものは何ですか?