mongodb - 如何从 1 分钟嵌套数组数据(mongodb、 Mongoose )聚合 OHLC 5 分钟

标签 mongodb mongoose aggregation-framework

我有一个 mongodb 数据存储,其中包含 1 分钟的 OHLCV 数据,如下所示(时间、开盘价、高价、低价、收盘价、交易量),使用 mongoose 在 nodejs 中存储。

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

我需要以相同的格式从该数据中提取 5 分钟的时间间隔。我无法在 mongodb/mongoose 中找到如何做到这一点,即使作为新手搜索了几个小时。请帮忙。它令人困惑,尤其是因为它的嵌套数组,并且数组中没有字段。

注意:假设对于 5 分钟的数据,您将从数据库中获得 4 个 1 分钟数据的样本(数组),然后 时间:最后 1 分钟数据数组的时间元素(那 5 分钟间隔)
打开:第一个 1 分钟数据数组的第一个元素(那 5 分钟间隔)
高:所有 1 分钟数据数组中第二个元素的最大值(那 5 分钟间隔)
低:所有 1 分钟数据数组中第 3 个元素的最小值(那 5 分钟间隔)
关闭:所有 1 分钟数据数组中第 4 个元素的最后一个(那 5 分钟间隔)
volume :所有 1 分钟数据数组中最后一个数组的最后一个元素(那 5 分钟间隔)
请检查视觉表示 here

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

最佳答案

您需要使用聚合管道来比较以纪元时间存储的数据数组中的第一个元素,获取 $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()

关于mongodb - 如何从 1 分钟嵌套数组数据(mongodb、 Mongoose )聚合 OHLC 5 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48375822/

相关文章:

mongodb - 在mongodb查询中检查数据是否在两个数字之间

mongoose - MongoDB Atlas 按引用文档字段搜索词搜索

javascript - Mongoose .geoNear聚合,添加基本查询选项

javascript - .find 不是函数错误

mongodb - 从两个字段创建一个数组

mongodb - Doctrine/MongoDB/Strategy - 使用 persist/flush 更新文档

c# - 身份服务器 4 - 停用发现端点

mongodb - 使用 $pull 和 $[identifier] 从嵌套数组中删除对象 (mongoDB 3.6)

javascript - Mongodb geoNear 和组聚合

MongoDB - 总和