代码之家  ›  专栏  ›  技术社区  ›  DanielRS

$展开用于聚合的双嵌套数组

  •  1
  • DanielRS  · 技术社区  · 7 年前

    我试图在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 回复  |  直到 7 年前
        1
  •  1
  •   s7vr    7 年前

    您可以在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]}
      }}
    ])
    
    推荐文章