微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据时间戳进行组聚合,并在Arrays MongoDB中获取其前面的字段值

如何解决根据时间戳进行组聚合,并在Arrays MongoDB中获取其前面的字段值

Mongo数据库阵列结构:

[
   {
      "time":[
         "2018-12-18T20:16:28.800Z","2018-12-18T20:16:28.800Z","2016-11-14T10:16:32.700Z","2017-09-17T11:16:54.500Z","2016-11-14T10:16:32.700Z"
      ],"foo":[
         2,5,9,6,3,7,8
      ]
   },{
      "time":[
         "2018-12-18T20:16:28.800Z","bar":[
         7,8,4,4
      ]
   }
]

预期输出准时输出一个文档:

{
   "_id":{
      "time":"2018-12-18T20:16:28.800Z"
   },"time":"2018-12-18T20:16:28.800Z","data":{
      "foo":2,"bar":7
   },"_id":{
      "time":""2018-12-18T20:16:28.800Z"
   },"time":""2018-12-18T20:16:28.800Z","data":{
      "foo":5,"bar":8
   },"_id":{
      "time":"2016-11-14T10:16:32.700Z"
   },"time":"2016-11-14T10:16:32.700Z","data":{
      "foo":9,"bar":9
   },"data":{
      "foo":6,"bar":4
   },"_id":{
      "time":"2018-12-18T20:16:28.800Z"
   },"data":{
      "foo":3,}

我有多个名为foobar的文档。
我想就时间进行分组,并且Output将是一次性邮票,其中不包含barfoo的值或多个值,并且获取有关时间的多个文档。

解决方法

您可以尝试

  • $project$map使用0迭代范围从time$range数组大小的循环,返回特定字段,
    • time使用$arrayElemAt获取元素
    • index从范围中获取索引
    • data作为对象,$reduce使用$$ROOT转换为数组后,迭代$objectToArray字段的循环,检查字段名称是否来自foo/bar然后它将从数字数组中获取元素,并使用$arrayToObject
    • 转换后返回
  • $unwind解构datas数组
  • $group按时间和索​​引排列,并将数据作为对象
  • $sort按索引字段升序
db.collection.aggregate([
  {
    $project: {
      datas: {
        $map: {
          input: { $range: [0,{ $size: "$time" }] },as: "a",in: {
            time: { $arrayElemAt: ["$time","$$a"] },index: "$$a",data: {
              $reduce: {
                input: { $objectToArray: "$$ROOT" },initialValue: {},in: {
                  $cond: [
                    { $in: ["$$this.k",["foo","bar"]] },{
                      $arrayToObject: [[
                          {
                            k: "$$this.k",v: { $arrayElemAt: ["$$this.v","$$a"] }
                          }
                      ]]
                    },{}
                  ]
                }
              }
            }
          }
        }
      }
    }
  },{ $unwind: "$datas" },{
    $group: {
      _id: {
        index: "$datas.index",time: "$datas.time"
      },time: { $first: "$datas.time" },data: { $mergeObjects: "$datas.data" }
    }
  },{ $sort: { "_id.index": 1 } }
])

Playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。