0

次のようなドキュメントのコレクションがあります。

{
    name: "Johann",
    surname: "Esburg",
    jobs: [
       {
           "profession": "chef",
           "salary": 1000
       }, {
           "profession": "gardener",
           "salary": 800
       }
    ]
},
{
    name: "Sam",
    surname: "Sonite",
    jobs: [
       {
           "profession": "doctor",
           "salary": 2000
       }, {
           "profession": "barber",
           "salary": 850
       }
    ]
}

結果が次のようになるように、給与が900を超えるすべての仕事を見つけたいと思います。

[
    {
        "profession": "chef",
        "salary": 1000
    }, {
        "profession": "doctor",
        "salary": 2000
    }
]

私は mongodb に頼らなければならないと確信していaggregationます。私が達成できた最高のものは次のとおりです。

db.persons.aggregate([
    {$unwind: "$jobs"},
    {$match: {"jobs.salary": {$gt: 900}}},
    {$project: {jobs: 1, _id: 0}}])

それは次を返します:

[
    {
        "jobs": {
            "profession": "chef",
            "salary": 1000
         }
    },
    {
        "jobs": {
            "profession": "doctor",
            "salary": 2000
        }
    }
]

しかし、これは私が望むものではありません。jobs鍵も外してほしい。埋め込みドキュメントの各変数を次のprojectionように指定する可能性があることはわかっています。

db.persons.aggregate([
    {$unwind: "$jobs"},
    {$match: {"jobs.salary": {$gt: 900}}},
    {$project:
        {"profession": "$jobs.profession",
         "salary": "$jobs.salary", _id: 0}}])

ただし、埋め込まれたドキュメントは一部のフィールドで異なる可能性があるため、避けたいと思います。

4

1 に答える 1

0

次の集約パイプライン操作を検討してください。$match最初のステップとしてのパイプラインは、集約がインデックスを使用し、パイプラインに入るドキュメントの数を最小限に抑えるためにコレクションを照会できるため、効率的な操作を確保するために必要です。

db.persons.aggregate([
    {
        "$match": {
            "jobs.salary": { "$gt": 900 }
        }
    },
    {
        "$unwind": "$jobs"
    }, 
    {
        "$match": {
            "jobs.salary": { "$gt": 900 }
        }
    },   
    {
        "$group": { 
            "_id": null,
            "jobs": {
                "$push": {
                    "profession": "$jobs.profession",
                    "salary": "$jobs.salary"
                }
            }
        }
    },
    {
        "$unwind": "$jobs"
    },
    {
        "$project": {
            "_id": 0, "profession": "$jobs.profession", "salary": "$jobs.salary"
        }
    }
])

サンプル出力:

/* 0 */
{
    "result" : [ 
        {
            "profession" : "chef",
            "salary" : 1000
        }, 
        {
            "profession" : "doctor",
            "salary" : 2000
        }
    ],
    "ok" : 1
}
于 2015-10-07T11:24:32.193 に答える