在 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 中项目嵌套列的主要内容,如果未能解决你的问题,请参考以下文章