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

基于共享密钥聚合多个对象数组的MongoDB,mongodb,nosql,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, "va

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

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

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

因此,我可以显示一个表格,显示每个用户和三个指标(每列一个指标,每行一个用户)。

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

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

请共享集合看起来您的输入文档不是文档或JSON格式。您将需要一个格式正确的输入文档来处理MongoDB查询。我的问题没有说清楚,我的不好。我更新了问题,使之更简洁。您的解决方案很有意义,现在我只是尝试将数据转换为您开始使用的格式。