在mongodb中项目嵌套列

时间:2014-04-22 17:33:24

标签: python sql mongodb

我在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}

感谢:)

1 个答案:

答案 0 :(得分: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})]