在 mongodb 中项目嵌套列

Posted

技术标签:

【中文标题】在 mongodb 中项目嵌套列【英文标题】:project nested columns in 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

谢谢:)

【问题讨论】:

【参考方案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 解决方案。我会接受你的回答。现在投票:)

以上是关于在 mongodb 中项目嵌套列的主要内容,如果未能解决你的问题,请参考以下文章

如何在mongodb的嵌套数组中添加数据

MongoDB 哈希索引

MongoDB Mongoose Schema 嵌套文档结构和关系

MongoDB:嵌套值的聚合计算

MongoDB查询:如何查找嵌套对象中的字符串

如何在 mongoDB 中取消嵌套和分组集合