MongoDB基于共享密钥聚合多个对象数组

时间:2019-10-29 00:44:32

标签: mongodb nosql

我正在编写一个查询,以为数据库中的每个用户计算多个指标。

我已经计算了所有指标,并具有这样的结构

{  
  "metric1": [{"user_id": 1, "val": 13},{"user_id": 2, "val": 100}],
  "metric2": [{"user_id": 2, "val": 29},{"user_id": 1, "val": 123}],
  "metric3": [{"user_id": 1, "val": 46},{"user_id": 2, "val": 111]
}

我正在尝试将以上内容转换为这种结构

{ 
  "user_id": [1,2],
  "metric1": [13, 100],
  "metric2": [29,123],
  "metric3": [46,111]
}

这样我可以显示一个表,该表显示每个用户和三个指标(每列一个指标,每行一个用户)。

1 个答案:

答案 0 :(得分:1)

考虑到您所说的是您的数据:

{
  "metric1": [
    {"id1": 1}, {"id2": 2}
  ],
    "metric2": [
    {"id2": 22}, {"id1": 11}
  ],
    "metric3": [
    {"id2": 222}, {"id1": 111}
  ]
}

您要做的就是使用$unwind来破坏数组,然后使用$objectToArray来访问键

db.blah.aggregate([
  { $unwind: '$metric1' },
  { $unwind: '$metric2' },
  { $unwind: '$metric3' },
  { $project: {'metric1': { $objectToArray: '$metric1' }, 'metric2': { $objectToArray: '$metric2' }, 'metric3': { $objectToArray: '$metric3' }} },
  { $sort: { 'metric1.k' : -1} },
  { $sort: { 'metric2.k' : -1} },
  { $sort: { 'metric3.k' : -1} },
  { $unwind: '$metric1' },
  { $unwind: '$metric2' },
  { $unwind: '$metric3' },
  { $group: {
    _id: null,
    user_id: { $addToSet: '$metric1.k' },
    metric1: { $addToSet: '$metric1.v' },
    metric2: { $addToSet: '$metric2.v' },
    metric3: { $addToSet: '$metric3.v' },
  } },
  { $project: { _id: 0 } }
]).pretty()

结果

{
    "user_id" : [
        "id1",
        "id2"
    ],
    "metric1" : [
        1,
        2
    ],
    "metric2" : [
        11,
        22
    ],
    "metric3" : [
        111,
        222
    ]
}