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

集計でフィールドの最も頻繁に発生する値を見つける必要があります

    さて、あなたはただ「補う」ことはできません。 $modeとしての演算子 は集計演算子ではなく、使用できるのは実際に存在する

    したがって、最も発生するグループ化された期間内にカテゴリ値を返すには、最初にそれらの値のそれぞれをグループ化し、発生回数を返す必要があります。次に、これらの結果をそのカウントで並べ替えて、その期間内に最大のカウントを記録したカテゴリ値を返すことができます。

        // Filter dates
        { "$match": { 
            "dt": { 
                "$gt": new Date("October 13, 2010 12:00:00"), 
                "$lt": new Date("November 13, 2010 12:00:00")
            } 
        }},
    
        // Group by hour and category, with avg and count
        { "$group": {
            "_id": {
                "dt": {
                    "$add": [
                        {
                            "$subtract": [
                                { "$subtract": ["$dt", new Date(0)] },
                                {
                                    "$mod": [
                                        { "$subtract": ["$dt", new Date(0)] },
                                        3600000//1000 * 60 * 60
                                    ]
                                }
                            ]
                        },
                        new Date(0)
                    ]
                },
                "category": "$category"
            }, 
            "price": { "$avg": "$price" },
            "count": { "$sum": 1 }
        }},
        // Sort on date and count
        { "$sort": { "_id.dt": 1, "count": -1 }},
    
        // Group on just the date, keeping the avg and the first category
        { "$group": {
            "_id": "$_id.dt",
            "price": { "$avg": "$price"}
            "category": { "$first": "$_id.category" }
        }}
    

    したがって、 $group 日付とカテゴリの両方で、$sum 。次に、 $sort したがって、グループ化された各日付の最大の「カウント」が一番上になります。最後に、 $firstを使用します 別の$groupを適用する場合 これは、各日付のカウントが最大のカテゴリを返すために、日付自体に適用されるだけです。

    $maxのような演算子に誘惑されないでください ここでは機能しないためです。主な違いは、カテゴリ値ごとに作成された「レコード/ドキュメント」との「結びつき」の関係です。したがって、必要な最大の「カウント」や最大の「カテゴリ」値ではなく、最大のカウントを「生成」したカテゴリ値です。したがって、$sortがあります ここで必要です。

    最後に、あなたが「破るべき」いくつかの習慣:

    • 何をしているのかを本当に理解していない限り、UTC形式以外の日付インスタンスデータを入力として使用しないでください。日付は常にUTCに変換されるため、少なくともテストリストでは、その方法で日付値を指定することに慣れておく必要があります。

    • 他の方法では少しきれいに見えるかもしれませんが、1000 * 60 * 60のようなものです 3600000よりもはるかにわかりやすいコードです 。同じ値ですが、1つの形式は、時間単位が一目でわかることを示しています。

    • 複利_id 値が1つしかない場合も、問題を混乱させる可能性があります。したがって、_id.dtにアクセスする意味はほとんどありません。 それが存在する唯一の値である場合。 _id内に複数のプロパティがある場合 それなら大丈夫です。ただし、単一の値は_idに直接割り当てる必要があります 1人。他に何も得られず、シングルは非常に明確です。




    1. Spring Data MongoDB:プロジェクションとアグリゲーション

    2. MongoDB-配列から複数のオブジェクトをプルします

    3. mongodb showdbslistDatabasesが失敗しました

    4. RedHat /CentOS7システムにMongoDB4.2をインストールする方法