MongoDB / pymongo: найти максимум во вложенных словарях - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу напечатать значение поля «Выходной раздел», где поле «Вероятность» имеет максимальное значение, для каждого ключа в поле «Входной раздел».

Я новичок в MongoDB и pymongo - насколько я могу судить, мне нужно как-то использовать агрегаты (пример из учебника):

db.collection.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])

Я не понимаю, как применить это к моему примеру.

content = [
        {
        "Stage": "Klage",
        "Heading": "Anträge",
        "Input-Section":

                {
                    "keyword1_keyword2_keyword3":
                            [
                                {
                                "Output-Section": "reply_option_1",
                                "Probability": 0.32},
                                {
                                "Output-Section": "reply_option_2",
                                "Probability": 0.1},
                                {
                                "Output-Section": "reply_option_3",
                                "Probability": 0.58}
                            ],

                    "keyword4_keyword5_keyword6":

                            [
                                {
                                "Output-Section": "reply_option_1",
                                "Probability": 0.35},
                                {
                                "Output-Section": "reply_option_2",
                                "Probability": 0.65}
                            ]

                }

        }
]

В результате я хотел бы увидеть что-н. лайк ["reply_option_3", "reply_option_2"]

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 03 сентября 2018

Для этого можно использовать структуру агрегации:

db['02'].aggregate(
    [
        // Stage 1
        {
            $facet: {
        // facet pipeline 1
                  kw123:[
                    {$project: {input:"$Input-Section.keyword1_keyword2_keyword3"}},
                    {$unwind: {path : "$input"}},
                    {$sort: {"input.Probability": -1}},
                    {$limit: 1},
                    {$project: {"Output-Section":"$input.Output-Section",_id:0 }},
                    ],
                    // facet pipeline 2
                    kw456:[
                    {$project: {input:"$Input-Section.keyword4_keyword5_keyword6"}},
                    {$unwind: {path : "$input"}},
                    {$sort: {"input.Probability": -1}},
                    {$limit: 1},
                    {$project: {"Output-Section":"$input.Output-Section",_id:0 }},],
                }
        },
        // Stage 2
        {
            $project: {
                results:{$setUnion:["$kw123.Output-Section","$kw456.Output-Section"]}
            }
        },
    ],
);

Это приведет к:

{ 
    "results" : [
        "reply_option_2", 
        "reply_option_3"
    ]
}

Если у вас есть другие поля, например keyword1_keyword2_keyword3, просто скопируйте и обновите конвейер фасета и добавьте новое поле в результаты.

Надеюсь, это поможет.

...