python - 如何展平聚合结果
问题描述
MongoDB:3.6+
我有这个 Pymongo/MongoDB 查询:
_data = db['history'].aggregate([
{'$lookup':
{
'from': 'mgmt_item',
'localField': 'id_mgmt_item',
'foreignField' : 'old_id',
'as': 'mgmt_item'
}
},
{'$match': query},
{'$project': projection}
])
我得到以下结果,这是正确的。
{
"_id":"a4f2a993-749d-4b27-a9bd-c5950babd1bf",
"id_mgmt_item":3,
"value":99.660095,
"image_path":"https://url/a4f2a993-749d-4b27-a9bd-c5950babd1bf.jpg",
"mgmt_item":[
{
"lang":{
"pt_BR":"Descrição..."
}
}
]
}
但是,我想将结果展平以将mgmt_item.lang.pt_BR的值作为mgmt_item attr 的值,如下所示:
{
"_id":"a4f2a993-749d-4b27-a9bd-c5950babd1bf",
"id_mgmt_item":3,
"value":99.660095,
"image_path":"https://url/a4f2a993-749d-4b27-a9bd-c5950babd1bf.jpg",
"mgmt_item":"Descrição..."
}
我应该在查询中进行哪些更改以获得所需的结果?
解决方案
您可以将以下 $replaceRoot 阶段添加到聚合列表的末尾,以根据需要进行展平:
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
"$$ROOT",
{
"mgmt_item": {
$arrayElemAt: [
"$mgmt_item.lang.pt_BR",
0
]
}
},
]
}
}
}
操场:
https://mongoplayground.net/p/iR8Qoc3TkXU
文件:
https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/
https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/
推荐阅读
- javascript - async/await 在 jQuery each() 中没有按预期工作
- c++ - 当像素可以直接写入显示缓冲区时,如何最好地渲染到窗口?
- python - 如果覆盖率降低,则构建失败
- python - 无法在 Ubuntu 14.04 LTS 上安装任何软件包,看到 dpkg: error processing package
- asp.net - 在幕后,RefreshTokens 是如何跟踪的?(ASP.NET Owin/OAuth2)
- vim - 保存没有管理员权限打开的文件
- cassandra - 当数据具有不均匀的生成率时,如何在 cassandra 中对时间序列数据进行建模?
- javascript - 使用 Jquery 和 Ajax 的手风琴列表
- jenkins - Jenkins 构建触发器“启用 Artifactory 触发器”不适用于 JFrog
- javascript - 使用 promise 时的执行顺序