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

複数のフィールドによるグループコレクションデータmongodb

    集計フレームワークを使用すると、ハッシュキーを使用する代わりに、 _id を使用してオブジェクトの配列を取得するため、結果は「目的の」出力とは少し異なります。 フィールドごとにグループ化することを表す値を持つキー。たとえば、

    の代わりに
    {
        "28-10-2016":{
            "success_count": 10, 
            "failure_count": 10
        },
        "29-10-2016": {
            "success_count": 10, 
            "failure_count": 10
        }
    }
    

    あなたは

    のようなより良い構造を持っているでしょう
    [
        {
            "_id": "28-10-2016",
            "success_count": 10, 
            "failure_count": 10
        },
            "_id": "29-10-2016",
            "success_count": 10, 
            "failure_count": 10
        }
    ]
    

    上記の結果を得るには、 <を使用する必要があります。 code> $ cond $sum<の演算子/ code> アキュムレータ演算子。 $ cond > 演算子は、最初の引数(if)に基づいて論理条件を評価し、評価がtrueの場合は2番目の引数(then)、falseの場合は3番目の引数(else)を返します。これにより、真/偽のロジックが1と0の数値に変換され、 $ sum それぞれ:

    "success_count": {
        "$sum": {
            "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
        }
    }
    

    結果のパイプラインとして、 $ dateToString _idの演算子 のキー式$ group パイプライン:

    Orders.aggregate([
        {
            "$group": {
                "_id": {
                    "$dateToString": { 
                        "format": "%Y-%m-%d", 
                        "date": "$created_at" 
                    }
                },
                "success_count": {
                    "$sum": {
                        "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
                    }
                },
                "failure_count": {
                    "$sum": {
                        "$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
                    }
                }
            }
        }
    ], function (err, orders){
        if (err) throw err;
        console.log(orders);
    })
    

    ただし、上記よりもはるかに高速に実行される、より柔軟でパフォーマンスの高いアプローチがあります。ここでは、集計結果の最も効率的なデータ構造は、たとえば次のスキーマに従います。

    orders = [
        {
            "_id": "28-10-2016",
            "counts": [
                { "status": "success", "count": 10 },
                { "status": "failure", "count": 10 }
            ]
        },
        {
            "_id": "29-10-2016",
            "counts": [
                { "status": "success", "count": 10 },
                { "status": "failure", "count": 10 }
            ]
        }
    ]
    

    次に、次のように代替パイプラインを実行することを検討してください

    Orders.aggregate([
        { 
            "$group": {
                "_id": { 
                    "date":  {
                        "$dateToString": { 
                            "format": "%Y-%m-%d", 
                            "date": "$created_at" 
                        }
                    },
                    "status": { "$toLower": "$status" }
                },
                "count": { "$sum": 1 }
            }
        },
        { 
            "$group": {
                "_id": "$_id.date",
                "counts": {
                    "$push": {
                        "status": "$_id.status",
                        "count": "$count"
                    }
                }
            }
        }
    ], function (err, orders){
        if (err) throw err;
        console.log(orders);
    })
    



    1. MongoError:ドキュメントの検証に失敗しました-floatとintの両方を同じフィールドに挿入する方法-これはdoubleとしてマークされていますか?

    2. エラー:タイプパラメータ `D`は、一部のローカルタイプのタイプパラメータとして使用する必要があります

    3. redisでのパイプラインとトランザクション

    4. mongodbドキュメントの配列から文字列を削除するにはどうすればよいですか?