Javascript 在mongoDB中聚合OHLC时如何避免时间间隔
我试图从mongoDB中存储的1分钟间隔数据库中提取ohlc 5分钟间隔。下面是我目前的问题Javascript 在mongoDB中聚合OHLC时如何避免时间间隔,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图从mongoDB中存储的1分钟间隔数据库中提取ohlc 5分钟间隔。下面是我目前的问题 myModel.aggregate([ {"$project": { "data": { "$let": { "vars": { "mints":{"$arrayElemAt":[{"$arrayElemAt":["$data",
myModel.aggregate([
{"$project":
{
"data":
{
"$let":
{
"vars":
{
"mints":{"$arrayElemAt":[{"$arrayElemAt":["$data",0]},0]},
"maxts":{"$arrayElemAt":[{"$arrayElemAt":["$data",-1]},0]}
},
"in":
{
"$map":
{
"input":{"$range":["$$mints",{"$add":["$$maxts",300]},300]},
"as":"rge",
"in":
{
"$let":
{
"vars":
{
"five":
{
"$filter":
{
"input":"$data",
"as":"fres",
"cond":
{
"$and":
[
{"$gte":[{"$arrayElemAt":["$$fres",0]},"$$rge"]},
{"$lt":[{"$arrayElemAt":["$$fres",0]},{"$add":["$$rge",300]}]}
]
}
}
}
},
"in":
[
{"$arrayElemAt":[{"$arrayElemAt":["$$five",-1]},0]},
{"$arrayElemAt":[{"$arrayElemAt":["$$five",0]},1]},
{"$max":{"$map":{"input":"$$five","as":"res","in":{"$arrayElemAt":["$$res",2]}}}},
{"$min":{"$map":{"input":"$$five","as":"res","in":{"$arrayElemAt":["$$res",3]}}}},
{"$arrayElemAt":[{"$arrayElemAt":["$$five",-1]},-2]},
{"$arrayElemAt":[{"$arrayElemAt":["$$five",-1]},-1]}
]
}
}
}
}
}
}
}
}
]);
它似乎提取了5分钟的间隔数据,但没有考虑1分钟间隔数据中的间隔。相反,对于这些时间瞬间,我得到的是空数组。如何避免空数组
示例1 DB数据:
5分钟提取的输出快照为
正如您在快照中看到的,我得到了很多空数组。我如何避免它们
我尝试在$and运算符中插入{“$ne”:[{“$arrayElemAt”:[“$$fres”,0]},null]}
,但没有帮助
2018年2月14日更新:根据Veeram的建议,以下是与建议变更合并的修改代码。但是,我仍然得到一个空数组(显然,在那个时间间隔中有许多空数组已经消失,但被单个空数组所取代),这也应该是固定的
db.getCollection('ohlc-koinex-1').aggregate(
[
{"$project":
{
"data":
{
"$let":
{
"vars":
{
"mints":{"$arrayElemAt":[{"$arrayElemAt":["$data",0]},0]},
"maxts":{"$arrayElemAt":[{"$arrayElemAt":["$data",-1]},0]}
},
"in":
{
"$setDifference":
[
{
"$map":
{
"input":{"$range":["$$mints",{"$add":["$$maxts",300]},300]},
"as":"rge",
"in":
{
"$let":
{
"vars":
{
"five":
{
"$filter":
{
"input":"$data",
"as":"fres",
"cond":
{
"$and":
[
{"$gte":[{"$arrayElemAt":["$$fres",0]},"$$rge"]},
{"$lt":[{"$arrayElemAt":["$$fres",0]},{"$add":["$$rge",300]}]}
]
}
}
}
},
"in":
{
"$cond":[
{"$eq":["$$five",[]]},
"$$five",
[
{"$arrayElemAt": [{"$arrayElemAt":["$$five",-1]},0]},
{"$arrayElemAt":[{"$arrayElemAt":["$$five",0]},1]},
{"$max":{"$map":{"input":"$$five","as":"res","in":{"$arrayElemAt":["$$res",2]}}}},
{"$min":{"$map":{"input":"$$five","as":"res","in":{"$arrayElemAt":["$$res",3]}}}},
{"$arrayElemAt":[{"$arrayElemAt":["$$five",-1]},-2]},
{"$arrayElemAt":[{"$arrayElemAt":["$$five",-1]},-1]}
]
]
}
}
}
}
},[]
]
}
}
}
}
}
]
)
是结果的快照您可以添加
$cond
运算符以说明间隙,然后添加$filter
以过滤空数组值
您需要两个更改
第一个更改是为间隙存储[]值,而不是使用空值数组
将内部$let表达式更新为以下内容:
{
"$let":{
"vars":{"five":...},
"in":{
"$cond":[
{"$eq":["$$five",[]]},
"$$five",
[{"$arrayElemAt":[{"$arrayElemAt":["$$five",-1]},0]},
....
{"$arrayElemAt":[{"$arrayElemAt":["$$five",-1]},-1]}]
]
}
}
}
第二个更改是从输出中过滤空数组值
{
"$project":{
"data":{
"$let":{
"vars":{"mints":...},
"in":{"$filter":{"input":{"$map":...},as:"flr", "cond":{"$ne":["$$flr",[]]}}}
}
}
}
}
非常感谢你,维拉姆。不过,这是一个小问题。间隙之间的所有空数组都消失了,但现在被一个空数组替换,正如我在上面更新的问题中所示。您能检查一下吗?Yw.Updated答案用$filter替换setDifference。应该像预期的那样工作。