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:如果您希望在单个文档中输出。

  1. 使用 $match 阶段过滤掉 D2C = 63 的文档。
  2. $group按月/D3C得到格式为{ k: "", v: ""}.
  3. 的数组
  4. $group 再按null 得到格式为{ k: "", v: ""}.
  5. 的数组
  6. 使用 $arrayToObject.
  7. 将数组转换为对象

试试这个:

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 }
  }
]