【问题标题】:project nested columns in mongodb在 mongodb 中项目嵌套列
【发布时间】:2014-04-22 17:33:24
【问题描述】:

我在 mongo 中有一个集合,其中的数据如下所示:

{
    "myinput": "myinput",
    "myoutput": {
        "Result": {
            "CrossData": {
                "CrossDto": [
                    {
                        "col1": "11",
                        "col2": "12",
                    },
                    {
                        "col1": "21",
                        "col2": "22",
                    },
                    {
                        "col1": "31",
                        "col2": "32",
                    }
                ],
                "ReqPartNumber": "myinput"
            }
        },
        "Status": {
            "Code": "0",
            "Message": "Successful Operation",
            "Success": "true"
        }
    }
}

我正在尝试在 SQL 中创建一个映射表,因此数据将如下所示,其中只有 Status 成功时 CrossDto 才会存在:

myinput  11   12
myinput  21   22
myinput  31   32
...

我正在尝试提出一个 mongodb 查询,以便在查询端尽可能简单地进行此操作,这样我就不会在 Python 中使用疯狂的嵌套结构将其转换为表格式。

到目前为止我做了什么:

db.collection.find({'myoutput.Status.Success':'true'}, {_id:0, myoutput:1}).limit(1)

它会选择状态为成功的记录,同时只显示“myoutput”..

但我想要的其实是深几层,是这样的:

{
    "CrossDto": [
        {
            "col1": "1",
            "col2": "1",
        },
        {
            "col1": "2",
            "col2": "2",
        },
        {
            "col1": "3",
            "col2": "3",
        }
    ],
    "ReqPartNumber": "myinput"
}

谁能帮帮我?如何配置 mongodb 的 projection 部分,这样我就可以只获得我想要的嵌套列......我期望类似这样的东西:

{_id=0, myoutput.Result.CrossData=1}

谢谢:)

【问题讨论】:

    标签: python sql mongodb


    【解决方案1】:

    在 MongoDB 中执行此操作的最佳方法是使用 Aggregation Framework。该框架是一个允许您查询和转换数据的管道。在你的情况下,你会想要这个:

    db.collection.aggregate({
        $match: {
            'myoutput.Status.Success':'true'
        }
    },
    {
        $project: {
            'CrossDto': '$myoutput.Result.CrossData.CrossDto',
            'ReqPartNumber': '$myoutput.Result.CrossData.ReqPartNumber'
        }
    })
    

    在 Python 中执行此操作确实不错,如果您的数据超出聚合框架可以处理的范围,您将不得不这样做:

    myData = [doc['myoutput']['Result']['CrossData'] for doc in db.collection.find({'myoutput.Status.Success':'true'}, {_id:0, myoutput:1})]
    

    【讨论】:

    • 嗨 Rob,感谢您的回答,逻辑对我来说很有意义.. 但它会触发错误:"errmsg" : "exception: aggregation result exceeds maximum document size (16MB)",
    • 如果您遇到该错误,这意味着您正在处理的数据(或更大的文档)超出了聚合框架的处理能力。你必须用 Python 来做,但应该不会太糟糕。我将在我的答案中添加如何在 Python 中执行此操作。
    • 嗨,Rob,非常感谢...我可以自己用 Python 完成...但我很想看看您的解决方案。如果您可以发布一些有效的 Python 解决方案。我会接受你的回答。现在投票:)
    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 2019-02-16
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2020-07-30
    相关资源
    最近更新 更多