$ unwind双重嵌套数组用于聚合

时间:2018-07-16 00:55:17

标签: arrays mongodb aggregation-framework

我正在尝试在mongodb中设置一个时间序列(使用this作为指导)。假设我有一个集合,其中每个文档如下所示:

{
  _id: '...',
  timestamp_minute: '2018-01-01T12:30:00.000Z',
  numbers: [[1, 2, ..., 10], ..., [1, 2, ..., 10]],
  letters: [[a, b, ..., j], ..., [a, b, ..., j]]
}

我如何展开它,使其看起来像这样:

[
  {_id: '...', timestamp_minute: '2018-01-01T12:30:00.000Z', values: 1, letters: a},
  {_id: '...', timestamp_minute: '2018-01-01T12:30:00.000Z', values: 2, letters: b},
  {_id: '...', timestamp_minute: '2018-01-01T12:30:00.000Z', values: 3, letters: c},
  ...
]

数据每分钟存储一次,精度为十分之一秒。这意味着第一级值通常为长度60(一分钟内的秒数),而每个嵌套的值都是长度10(一秒的十分之一秒)。

我希望能够对其进行扩展以便生成汇总数据。

1 个答案:

答案 0 :(得分:1)

您可以尝试在3.4版及更高版本中进行以下汇总。

db.colname.aggregate([
  {"$project":{
    "timestamp_minute":1,
    "numbersandletters":{
      "$map":{
        "input":{"$range":[0,{"$size":"$numbers"}]},
        "as":"ix",
        "in":{
          "$zip":{
            "inputs":[
              {"$arrayElemAt":["$numbers","$$ix"]},
              {"$arrayElemAt":["$letters","$$ix"]}
            ]
          }
        }
      }
    }
  }},
  {"$unwind":"$numbersandletters"},
  {"$unwind":"$numbersandletters"},
  {"$project":{
    "timestamp_minute":1,
    "values":{"$arrayElemAt":["$numbersandletters",0]},
    "letters":{"$arrayElemAt":["$numbersandletters",1]}
  }}
])