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

マックスとMongodbでのグループ化

    目的の結果を得るには、サブクエリで始まるSQLクエリを分解することから始めます。

    Select *
    from tblData 
    Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate
    

    同等のmongoクエリは次のとおりです。

    db.getCollection("_core.data").aggregate([
        {
            "$match": {
                "TFN": { "$in": tmpTFNList },
                "TrendDate": {
                    "$gte": startDate,
                    "$lte": endDate
                }
            }
        }
    ])
    

    $ group >

    に相当する総計
    Select TFN, Max(Impressions) MaxImpression 
    from tblData 
    Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate
    Group by TFN 
    

    フォローする

    db.getCollection("_core.data").aggregate([
        {
            "$match": {
                "TFN": { "$in": tmpTFNList },
                "TrendDate": {
                    "$gte": startDate,
                    "$lte": endDate
                }
            }
        },
        {
            "$group": {
                "_id": "$TFN",
                "MaxImpression": { "$max": "$Impression" }
            }
        }
    ])
    

    上位5つのクエリ

    Select Top 5 a.TFN, a.MaxImpression as MaxCount from ( 
        Select TFN, Max(Impressions) MaxImpression 
        from tblData 
        Where TFN in (Select TFN From @tmpTFNList) 
            and TrendDate between @StartDate AND @EndDate
        Group by TFN 
    ) a
    

    $で可能になります制限 演算子と $ project ステージとして

    db.getCollection("_core.data").aggregate([
        { /* WHERE TFN in list AND TrendDate between DATES */
            "$match": {
                "TFN": { "$in": tmpTFNList },
                "TrendDate": {
                    "$gte": startDate,
                    "$lte": endDate
                }
            }
        },
        { /* GROUP BY TFN */
            "$group": {
                "_id": "$TFN",
                "MaxImpression": { "$max": "$Impression" }
            }
        },
        { "$limit": 5 }, /* TOP 5 */
        { /* SELECT a.MaxImpression as MaxCount */
            "$project": {
                "TFN": "$_id",
                "_id": 0,
                "MaxCount": "$MaxImpression"
            }
        }
    ])
    

    更新

    この編集 のサンプルから目的の結果を得るには 、追加の $が必要です並べ替え $group<の前のパイプライン/ code> TrendDateでドキュメントを並べ替える場所 およびImpression フィールド、両方とも降順。

    次に、 $ first $group内のアキュムレータ演算子 パイプラインにドキュメントの順序付けられたストリームがあるため、最大の印象を得るパイプラインステージ。

    改訂された集計操作を次のように実行することを検討してください:

    db.getCollection('collection').aggregate([
        { 
            "$match": {
                "TFN": { "$in": tmpTFNList },
                "TrendDate": {
                    "$gte": startDate,
                    "$lte": endDate
                }
            }
        },
        { "$sort": { "TrendDate": -1, "Impression": -1 } },
        {  
            "$group": {
                "_id": "$TFN",
                "MaxImpression": { "$first": "$Impression" }
            }
        },
        { "$limit": 5 }, 
        {   
            "$project": {
                "TFN": "$_id",
                "_id": 0,
                "MaxCount": "$MaxImpression"
            }
        }
    ])
    

    サンプル出力

    /* 1 */
    {
        "TFN" : 84251456,
        "MaxCount" : 22
    }
    
    /* 2 */
    {
        "TFN" : 84251455,
        "MaxCount" : 35
    }
    



    1. アーティストの推薦をデザインする上で提案が必要

    2. ソートされたセットとuidを保存するための最良の方法をRedisします

    3. MongooseとNode.jsとアンダースコアを使用してコードを生成する簡単な方法は?

    4. <project>.meteor.comでホストされているmongoインスタンスへの接続エラーを解読します