我们假设这就是 mongo-db 中示例文档的样子,
[
{
"_id": "1",
"attrib_1": "value_1",
"attrib_2": "value_2",
"months": {
"2": {
"month": "2",
"year": "2008",
"transactions": [
{
"field_1": "val_1",
"field_2": "val_2",
},
{
"field_1": "val_4",
"field_2": "val_5",
"field_3": "val_6"
},
]
},
"3": {
"month": "3",
"year": "2018",
"transactions": [
{
"field_1": "val_7",
"field_3": "val_9"
},
{
"field_1": "val_10",
"field_2": "val_11",
},
]
},
}
}
]
所需的输出是这样的,(我只是展示了第 2 个月和第 3 个月)
id |
months |
year |
field_1 |
field_2 |
field_3 |
1 |
2 |
2008 |
val_1 |
val_2 |
|
1 |
2 |
2008 |
val_4 |
val_5 |
val_6 |
1 |
3 |
2018 |
val_7 |
|
val_9 |
1 |
3 |
2018 |
val_10 |
val_11 |
|
我的尝试:
我在 Py-Mongo 中尝试过类似的东西,
pipeline = [
{
# some filter logic here to filter data basically first
},
{
"$addFields": {
"latest": {
"$map": {
"input": {
"$objectToArray": "$months",
},
"as": "obj",
"in": {
"all_field_1" : {"$ifNull" : ["$$obj.v.transactions.field_1", [""]]},
"all_field_2": {"$ifNull" : ["$$obj.v.transactions.field_2", [""]]},
"all_field_3": {"$ifNull" : ["$$obj.v.transactions.field_3", [""]]},
"all_months" : {"$ifNull" : ["$$obj.v.month", ""]},
"all_years" : {"$ifNull" : ["$$obj.v.year", ""]},
}
}
}
}
},
{
"$project": {
"_id": 1,
"months": "$latest.all_months",
"year": "$latest.all_years",
"field_1": "$latest.all_field_1",
"field_2": "$latest.all_field_2",
"field_3": "$latest.all_field_3",
}
}
]
# and I executed it as
my_db.collection.aggregate(pipeline, allowDiskUse=True)
上面实际上是带来数据,但它将它们带入列表中。有没有一种方法可以轻松地将它们带到 mongo 本身的每一行?
上面这样带来数据,
id |
months |
year |
field_1 |
field_2 |
field_3 |
1 |
["2", "3"] |
["2008", "2018"] |
[["val_1", "val_4"], ["val_7", "val_10"]] |
[["val_2", "val_5"], ["", "val_11"]] |
[["", "val_6"], ["val_9", ""]] |
非常感谢您对同样的事情以及更好的方法做出的宝贵意见!
谢谢你的时间。
我的 Mongo 版本是 3.4.6,我使用 PyMongo 作为我的驱动程序。您可以在以下位置查看正在执行的查询:mongodb 游乐场 https://mongoplayground.net/p/SOolELzKRDw