如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)
Posted
技术标签:
【中文标题】如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)【英文标题】:How to aggregate OHLC 5 min from 1 min nested array data (mongodb, mongoose) 【发布时间】:2018-06-30 17:51:40 【问题描述】:我有一个 mongodb 数据存储,其中使用 mongoose 在 nodejs 中存储 1 分钟 OHLCV 数据,如下所示(时间、打开、高、低、关闭、音量)。
"_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 分钟数据的样本(数组),那么 time :最后 1 分钟数据数组的时间元素(该 5 分钟间隔) open : 前 1 分钟数据数组的第一个元素(即 5 分钟间隔) 高:所有 1 分钟数据数组中第二个元素的最大值(即 5 分钟间隔) 低:所有 1 分钟数据数组中第 3 个元素的最小值(该 5 分钟间隔) 关闭:所有 1 分钟数据数组中第 4 个元素的最后一个(在 5 分钟间隔内) 卷:所有 1 分钟数据数组(该 5 分钟间隔)中最后一个数组的最后一个元素 请检查视觉表示here
想法是能够以相同的方式从基本的 1 分钟数据库中提取 5 分钟、10 分钟、30 分钟、1 小时、4 小时、1 天的间隔。
【问题讨论】:
试试这样的包:npmjs.com/package/ohlc-aggregator 【参考方案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()
【讨论】:
它没有返回任何东西。此外,请检查我在问题中添加的 NOTE 部分。 您是否更改了查询中的$start
和$end
值,应该是纪元时间?并且该时期的数据存在于收集中?
我做了,但结果仍然是空的。是的数据存在于集合中。这是我执行的查询。 db.col.aggregate( [ $project : data : $filter : input : "$data", as : "d", cond : $and : [$lt : [ $arrayElemAt : ["$$d" , 0], "1516599860285"], $gte : [ $arrayElemAt : ["$$d" , 0], "1516597690510"]] ] ).pretty()
请在此处找到示例数据集gist.github.com/parthi2929/36e6898cff7be45ccdd008ec750e70e9
确实。再次没有返回。以上是关于如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)的主要内容,如果未能解决你的问题,请参考以下文章
使用 T-SQL 将 OHLC-Stockmarket 数据分组到多个时间范围内
ohlc(open,high,low and close) 两个日期范围之间不同时间的记录内部(1,5,15,60,120)分钟,1 天即使没有记录