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

Mongo集約ネスト配列

    これの最も簡単な形式は、「パラメータ」「名前」によってキー設定されたものを保持することです:

    db.collection.aggregate(
       // Unwind the array
       { "$unwind": "$parameter"},
    
       // Group on the "_id" and "name" and $sum "value"
       { "$group": {
           "_id": { 
               "userId": "$userId",
               "name": "$parameter.name"
           }, 
           "value": { "$sum": "$parameter.value" } 
       }},
    
       // Put things into an array for "nice" processing
       { "$group": {
           "_id": "$_id.userId",
           "values": { "$push": { 
               "name": "$_id.name",
               "value": "$value"
           }}
       }}
    )
    

    本当に 名前の「値」をフィールド値として持つ必要があります。できます 次のようにします。ただし、フィールド/プロパティを「投影」しているため、コードですべて指定する必要があります。 。もう「動的」になることはできず、コーディング/生成しています。 それぞれ:

    db.collection.aggregate([
        // Unwind the array
        { "$unwind": "$parameter"},
    
       // Group on the "_id" and "name" and $sum "value"
        { "$group": {
            "_id": {
                 "userId": "$userId",
                 "name": "$parameter.name"
            },
            "value": { "$sum": "$parameter.value"}
        }},
    
        // Project out discrete "field" names with $cond
        { "$project": {
            "name1": { "$cond": [
                { "$eq": [ "$_id.name", "name1" ] },
                "$value",
                0
            ]},
            "name2": { "$cond": [
                { "$eq": [ "$_id.name", "name2" ] },
                "$value",
                0
            ]},
            "name3": { "$cond": [
                { "$eq": [ "$_id.name", "name3" ] },
                "$value",
                0
            ]},
        }},
    
        // The $cond put "0" values in there. So clean up with $group and $sum
        { "$group": { 
            _id: "$_id.userId",
            "name1": { "$sum": "$name1" },
            "name2": { "$sum": "$name2" },
            "name3": { "$sum": "$name3" }
        }}
    

    ])

    したがって、追加の手順で希望する結果が得られますが(_idを変更する最終プロジェクトでも同様です) userIdへ )、私の考えでは、本当に必要でない限り、短いバージョンで十分に機能します。そこからの出力も考慮してください:

    {
        "_id" : ObjectId("53245016ea402b31d77b0372"),
        "values" : [
            {
                "name" : "name3",
                "value" : 2
            },
            {
                "name" : "name2",
                "value" : 0
            },
            {
                "name" : "name1",
                "value" : 150
            }
        ]
    }
    

    個人的にはそれを使用します。しかし、あなたの選択。



    1. MongoDBバウンドクエリ:マイルをラジアンに変換するにはどうすればよいですか?

    2. MongoDB-クエリとは異なり、インデックスを使用しません

    3. mongoDBでグループ化し、結果のすべてのフィールドを返す方法

    4. BSON ::Timestampをrubytimeに、またはその逆に変換する方法