如何从1分钟嵌套数组数据(mongodb,mongoose)

时间:2018-01-22 06:34:14

标签: mongodb mongoose aggregation-framework

我有一个mongodb数据存储,在nodejs中使用mongoose存储1分钟OHLCV数据,如下所示(时间,开放,高,低,关闭,音量)。

{
   "_id":1,
   "__v":0,
   "data":[
      [
         1516597690510,
         885000,
         885000,
         885000,
         885000,
         121.2982
      ],
      [
         1516597739868,
         885000,
         885000,
         885000,
         885000,
         121.2982
      ]
      ...
   ]
}

我需要从这个数据中以相同的格式提取5分钟的时间间隔。我找不到如何在mongodb / mongoose中做到这一点,即使经过几个小时的搜索就像新手一样。请帮助。令人困惑的是esp,因为它的嵌套数组,并且没有数组内的字段。

注意:假设5分钟的数据,您将有4个数据库中1分钟数据的样本(数组),然后 时间:最后1分钟数据阵列的时间元素(该5分钟间隔)
open:第一个1分钟数据阵列的第一个元素(5分钟间隔) 高:所有1分钟数据阵列中的第二个元素的最大值(该间隔为5分钟)
低:所有1分钟数据阵列中的第3个元素的最小值(5分钟间隔) close:所有1分钟数据阵列中的第4个元素的最后一个(5分钟间隔) volume:所有1分钟数据阵列中最后一个数组的最后一个元素(5分钟间隔) 请检查可视化表示here

想法是能够以相同的方式从基础1分钟数据库中提取5分钟,10分钟,30分钟,1小时,4小时,1天间隔。

1 个答案:

答案 0 :(得分:0)

您需要使用聚合管道来比较数据数组中存储在纪元时间的第一个元素,获取$start$end间隔的纪元时间,在查询中使用该值

 db.col.aggregate(
    [
        {$project : {
            data : {
                    $filter : {input : "$data", as : "d", cond : {$and : [{$lt : [ {$arrayElemAt : ["$$d" , 0]}, "$end"]}, {$gte : [ {$arrayElemAt : ["$$d" , 0]}, "$start"]}]}}
                }
            }
        }
    ]
).pretty()