首页 > 解决方案 > MongoDB/pymongo:在嵌套字典中查找最大值

问题描述

我想为字段“输入部分”中的每个键打印字段“输出部分”的值,其中字段“概率”具有最大值。

我是 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"]

我会很感激任何帮助。

标签: mongodbpymongo

解决方案


您可以使用聚合框架来实现这一点:

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"
    ]
}

如果您有其他字段,例如关键字 1_keyword2_keyword3,只需复制和更新构面管道,然后将新字段添加到结果中。

希望能帮助到你。


推荐阅读