python - MongoDB按特定字段从数组中的对象聚合到对象
问题描述
我想转换这种类型的文档(数组中的对象):
[{"name": "david", "props": {"prop1": {"AR": 9, "NY": 8}, "prop2":
{"AR": 10, "NY": 9}}},
{"name": "john", "props": {"prop1": {"AR": 7, "NY": 8}, "prop2": {"AR":
8, "NY": 9}}}]
进入这个(按“AR”字段过滤):
{"david": {"prop1": 9, "prop2": 10}, "john": {"prop1": 7, "prop2": 8}}
使用 MongoDB 聚合。有什么想法吗?
解决方案
有两个非常有用的运算符:$objectToArrayk-v
将对象转换为对数组,$arrayToObject将数组转换回对象。所以你应该使用第一个,重塑你的对象,然后使用第二个。所以有这样的文件:
{
array: [
{"name": "david", "props": {"prop1": {"AR": 9, "NY": 8}, "prop2": {"AR": 10, "NY": 9}}},
{"name": "john", "props": {"prop1": {"AR": 7, "NY": 8}, "prop2": {"AR": 8, "NY": 9}}}
]
}
您可以使用以下聚合:
db.col.aggregate([
{
$project: {
output: {
$arrayToObject: {
$map: {
input: "$array",
as: "doc",
in: {
k: "$$doc.name",
v: {
$arrayToObject: {
$map: {
input: { $objectToArray: "$$doc.props" },
as: "prop",
in: { k: "$$prop.k", v: "$$prop.v.AR" }
}
}
}
}
}
}
}
}
}
])
哪个输出:
{ "_id" : ..., "output" : { "david" : { "prop1" : 9, "prop2" : 10 }, "john" : { "prop1" : 7, "prop2" : 8 } } }
推荐阅读
- php - 正则表达式 preg_split
- python - 使用条件拆分字符串
- algorithm - 检测连接三角形组
- android - 共享首选项仅在应用重启后更新
- javascript - 目标容器不是使用 webpack 4 和 React 的 DOM 元素
- arm - 将 R0 寄存器总是在其他任何东西之前使用吗?
- c++ - 如何用值替换指令?
- python - 如何使用 python 中的纬度和经度数据绘制地图并突出显示地图中的几个纬度和经度点?ints
- arrays - 如何使用 Newtonsoft 在 Vb.net 中正确解析 JSON 字符串
- linux - 当从另一个 sed 命令通过管道传输时,sed 不起作用