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

Mongo Aggregation:カウントのオブジェクトへの$groupおよび$project配列

    MongoDb 3.4以降では、 $arrayToObjectの使用を活用できます。 演算子を使用して、目的の結果を取得します。次の集約パイプラインを実行する必要があります:

    db.collection.aggregate([
        { "$group": {
            "_id": {  
                "date": "$install_date",  
                "platform": { "$toLower": "$platform" }
            },
            "count": { "$sum": 1 }
        } },
        { "$group": {
            "_id": "$_id.date",
            "counts": {
                "$push": {
                    "k": "$_id.platform",
                    "v": "$count"
                }
            }
        } },
        {  "$addFields": {
            "install_date": "$_id", 
            "platform": { "$arrayToObject": "$counts" }
        }  },
        { "$project": { "counts": 0, "_id": 0 } } 
    ])
    

    古いバージョンの場合は、 $condを利用してください $groupの演算子 次のようなプラットフォームフィールド値に基づいてカウントを評価するパイプラインステップ:

    db.collection.aggregate([    
        { "$group": { 
            "_id": "$install_date",             
            "android_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "android" ] }, 1, 0 ]
                }
            },
            "ios_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "ios" ] }, 1, 0 ]
                }
            },
            "facebook_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "facebook" ] }, 1, 0 ]
                }
            },
            "kindle_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$platform", "kindle" ] }, 1, 0 ]
                }
            } 
        } },
        { "$project": {
            "_id": 0, "install_date": "$_id",            
            "platform": {
                "android": "$android_count",
                "ios": "$ios_count",
                "facebook": "$facebook_count",
                "kindle": "$kindle_count"
            }
        } }
    ])
    

    上記では、 $cond 最初の引数(if)として論理条件を取り、評価がtrue(then)の場合は2番目の引数、false(else)の場合は3番目の引数を返します。これにより、true / falseが1と0に戻り、$sumにフィードされます。 それぞれ。

    たとえば、{ "$eq": [ "$platform", "facebook" ] },の場合 trueの場合、式は{ $sum: 1 }に評価されます それ以外の場合は、{ $sum: 0 }になります




    1. マングースモデルでメソッドを定義するにはどうすればよいですか?

    2. Node.jsでRESTfulAPIを最適に作成する方法

    3. mongodbのインデックス付き列で重複をすばやく見つける方法

    4. 文字列をMongoDBのObjectIDに変換します