MongoDB:将多维信息聚合成面板数据
MongoDB: Aggregating multidimensional info into a panel data
我是 MongoDB 的初学者,我正在学习聚合。我有以下文档,它是来自 Inflation 的信息,它看起来像这样:
{
"_id": {
"$oid": "60678f561091100d5dbe2ddf"
},
"V": 0.21,
"D1C": "202001",
"D2C": 63,
"D3C": 7169,
},
{
"_id": {
"$oid": "60678f561091100d5dbe2de0"
},
"V": 0.39,
"D1C": "202001",
"D2C": 63,
"D3C": 7170,
},
{
"_id": {
"$oid": "60678f561091100d5dbe2de1"
},
"V": 0.2,
"D1C": "202001",
"D2C": 63,
"D3C": 7171,
},
(...)
{
"_id": {
"$oid": "60678f561091100d5dbe2fa8"
},
"V": 0.21,
"D1C": "202001",
"D2C": 69,
"D3C": 7169,
},
{
"_id": {
"$oid": "60678f561091100d5dbe2fa9"
}
"V": 0.39,
"D1C": "202001",
"D2C": 69,
"D3C": 7170,
}
"V" 是 inflation 的值,"D1C" 是月份,"D2C" 是指数类型(即 % yearly accumulated 或 % monthly),"D3C" 是组inflation(即食品、工业、服务)。
我想以一种易于选择任意值“D2C”并将数据导入 pandas 数据帧的方式聚合这些数据。
更具体地说,我希望我能以一种只要求 D2C=63 并得到类似这样的数据的方式获得数据:
[ { "7169" : {'01/2020' : 0.21, '02/2020' : 0.66, ...},
{ "5555" : {'01/2020' : 0.21, '02/2020' : 0.66, ...},]
在某种程度上,我将所有组作为字典的键,值将是一个包含引用该组的日期和值对的字典。
谢谢大家,复活节快乐!
解决方案 #1:如果您希望在单个文档中输出。
- 使用
$match
阶段过滤掉 D2C
= 63
的文档。
$group
按月/D3C
得到格式为{ k: "", v: ""}
. 的数组
$group
再按null
得到格式为{ k: "", v: ""}
. 的数组
- 使用 $arrayToObject.
将数组转换为对象
试试这个:
db.Inflation.aggregate([
{
$match: { "D2C": 63 }
},
{
$group: {
_id: "$D3C",
array: {
$push: { k: "$D1C", v: "$V" }
}
}
},
{
$group: {
_id: null,
array: {
$push: {
k: { $toString: "$_id" },
v: { $arrayToObject: "$array" }
}
}
}
},
{
$replaceRoot: {
newRoot: { $arrayToObject: "$array" }
}
}
])
解决方案 #1 的输出:
{
"7169" : {
"202001" : 0.21
},
"7170" : {
"202001" : 0.39
},
"7171" : {
"202001" : 0.2
}
}
解决方案#2:如果您希望输出为文档数组。
db.Inflation.aggregate([
{
$match: { "D2C": 63 }
},
{
$group: {
_id: "$D3C",
array: {
$push: { k: "$D1C", v: "$V" }
}
}
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: [
[{
k: { $toString: "$_id" },
v: { $arrayToObject: "$array" }
}]
]
}
}
}
])
解决方案 #2 的输出:
[
{
"7169": { "202001": 0.21 }
},
{
"7170": { "202001": 0.39 }
},
{
"7171": { "202001": 0.2 }
}
]
我是 MongoDB 的初学者,我正在学习聚合。我有以下文档,它是来自 Inflation 的信息,它看起来像这样:
{
"_id": {
"$oid": "60678f561091100d5dbe2ddf"
},
"V": 0.21,
"D1C": "202001",
"D2C": 63,
"D3C": 7169,
},
{
"_id": {
"$oid": "60678f561091100d5dbe2de0"
},
"V": 0.39,
"D1C": "202001",
"D2C": 63,
"D3C": 7170,
},
{
"_id": {
"$oid": "60678f561091100d5dbe2de1"
},
"V": 0.2,
"D1C": "202001",
"D2C": 63,
"D3C": 7171,
},
(...)
{
"_id": {
"$oid": "60678f561091100d5dbe2fa8"
},
"V": 0.21,
"D1C": "202001",
"D2C": 69,
"D3C": 7169,
},
{
"_id": {
"$oid": "60678f561091100d5dbe2fa9"
}
"V": 0.39,
"D1C": "202001",
"D2C": 69,
"D3C": 7170,
}
"V" 是 inflation 的值,"D1C" 是月份,"D2C" 是指数类型(即 % yearly accumulated 或 % monthly),"D3C" 是组inflation(即食品、工业、服务)。
我想以一种易于选择任意值“D2C”并将数据导入 pandas 数据帧的方式聚合这些数据。
更具体地说,我希望我能以一种只要求 D2C=63 并得到类似这样的数据的方式获得数据:
[ { "7169" : {'01/2020' : 0.21, '02/2020' : 0.66, ...},
{ "5555" : {'01/2020' : 0.21, '02/2020' : 0.66, ...},]
在某种程度上,我将所有组作为字典的键,值将是一个包含引用该组的日期和值对的字典。
谢谢大家,复活节快乐!
解决方案 #1:如果您希望在单个文档中输出。
- 使用
$match
阶段过滤掉D2C
=63
的文档。 $group
按月/D3C
得到格式为{ k: "", v: ""}
. 的数组
$group
再按null
得到格式为{ k: "", v: ""}
. 的数组
- 使用 $arrayToObject. 将数组转换为对象
试试这个:
db.Inflation.aggregate([
{
$match: { "D2C": 63 }
},
{
$group: {
_id: "$D3C",
array: {
$push: { k: "$D1C", v: "$V" }
}
}
},
{
$group: {
_id: null,
array: {
$push: {
k: { $toString: "$_id" },
v: { $arrayToObject: "$array" }
}
}
}
},
{
$replaceRoot: {
newRoot: { $arrayToObject: "$array" }
}
}
])
解决方案 #1 的输出:
{
"7169" : {
"202001" : 0.21
},
"7170" : {
"202001" : 0.39
},
"7171" : {
"202001" : 0.2
}
}
解决方案#2:如果您希望输出为文档数组。
db.Inflation.aggregate([
{
$match: { "D2C": 63 }
},
{
$group: {
_id: "$D3C",
array: {
$push: { k: "$D1C", v: "$V" }
}
}
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: [
[{
k: { $toString: "$_id" },
v: { $arrayToObject: "$array" }
}]
]
}
}
}
])
解决方案 #2 的输出:
[
{
"7169": { "202001": 0.21 }
},
{
"7170": { "202001": 0.39 }
},
{
"7171": { "202001": 0.2 }
}
]