我在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}
感谢:)
答案 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})]