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

複数のフィールドで同時にMongodb集計(カウント)

    集計フレームワークは、データに基づいてキーを作成することはなく、すべきではありません 「データ」はキーではなく実際にはデータであるため、そうしているので、パターンに固執する必要があります。

    つまり、基本的にこれを行うことができます:

    db.data.aggregate([
        { "$group": {
            "_id": {
                "event_type": "$event",
                "day": { "$dayOfWeek": "$date" }
            },
            "count": { "$sum": 1 } 
        }}
    ])
    

    これにより、出力に複数のドキュメントが含まれていても、イベントごとに曜日ごとの発生がカウントされますが、これはイベントごとに1つのドキュメントに簡単に変更できます。

    db.data.aggregate([
        { "$group": {
            "_id": {
                "event_type": "$event",
                "day": { "$dayOfWeek": "$date" }
            },
            "count": { "$sum": 1 } 
        }},
        { "$group": {
            "_id": "$_id.event_type",
            "days": { "$push": { "day": "$_id.day", "count": "$count" } }
        }}
    ])
    

    そしてそれは配列形式ですが、それでもあなたが望む結果を保持します。

    あなたが本当にあなたの正確な形をすることに熱心であるならば、あなたはこのような何かをしたいと思うでしょう:

    db.data.aggregate([
        { "$group": {
            "_id": "$event",
            "1": {
                "$sum": {
                    "$cond": [
                        { "$eq": [{ "$dayOfWeek": "$date" }, 1 ] },
                        1,
                        0
                    ]
                }
            },
            "2": {
                "$sum": {
                    "$cond": [
                        { "$eq": [{ "$dayOfWeek": "$date" }, 2 ] },
                        1,
                        0
                    ]
                }
            },
            "3": {
                "$sum": {
                    "$cond": [
                        { "$eq": [{ "$dayOfWeek": "$date" }, 3 ] },
                        1,
                        0
                    ]
                }
            },
            "4": {
                "$sum": {
                    "$cond": [
                        { "$eq": [{ "$dayOfWeek": "$date" }, 4 ] },
                        1,
                        0
                    ]
                }
            },
            "5": {
                "$sum": {
                    "$cond": [
                        { "$eq": [{ "$dayOfWeek": "$date" }, 5 ] },
                        1,
                        0
                    ]
                }
            },
            "6": {
                "$sum": {
                    "$cond": [
                        { "$eq": [{ "$dayOfWeek": "$date" }, 6 ] },
                        1,
                        0
                    ]
                }
            },
            "7": {
                "$sum": {
                    "$cond": [
                        { "$eq": [{ "$dayOfWeek": "$date" }, 7 ] },
                        1,
                        0
                    ]
                }
            }
        }}
    )
    

    しかし、それは非常に時間がかかるので、私は最初の解決策、またはおそらく2番目の解決策に固執します。それらは短く、読みやすいからです。



    1. EM ::Synchrony#syncを簡単に使用すると、「ルートファイバー」FiberErrorが発生します-私のせいですか?

    2. S3をデータベースとデータベース(MongoDBなど)として使用する

    3. Springデータmongodbがmongodb接続を閉じていない

    4. PyMongoを使用した自己署名SSL接続