如何使用MongoDB中的时间序列数据计算回报

问题描述 投票:0回答:1

我有以下格式的时间序列数据

{
    "_id" : "adfsdgsd",
    "data" : [ 
        {
            "d" : ISODate("2006-11-14T00:00:00.000Z"),
            "v" : 10.0
        }, 
        {
            "d" : ISODate("2006-11-16T00:00:00.000Z"),
            "v" : 10.279
        }, 
        {
            "d" : ISODate("2006-11-17T00:00:00.000Z"),
            "v" : 10.208
        }, 
        {
            "d" : ISODate("2006-11-20T00:00:00.000Z"),
            "v" : 10.243
        }, 
        {
            "d" : ISODate("2006-11-21T00:00:00.000Z"),
            "v" : 10.313
        }, 
        {
            "d" : ISODate("2006-11-22T00:00:00.000Z"),
            "v" : 10.353
        }, 
        {
            "d" : ISODate("2006-11-23T00:00:00.000Z"),
            "v" : 10.376
        }, 
        {
            "d" : ISODate("2006-11-24T00:00:00.000Z"),
            "v" : 10.4
        }, 
        {
            "d" : ISODate("2006-11-27T00:00:00.000Z"),
            "v" : 10.406
        }, 
        {
            "d" : ISODate("2006-11-28T00:00:00.000Z"),
            "v" : 10.366
        }, 
        {
            "d" : ISODate("2006-11-29T00:00:00.000Z"),
            "v" : 10.43
        }, 
        {
            "d" : ISODate("2006-11-30T00:00:00.000Z"),
            "v" : 10.462
        }, 
        {
            "d" : ISODate("2006-12-01T00:00:00.000Z"),
            "v" : 10.498
        }
    ]
}

我想计算mongo的最后一周回报

mongodb time-series percentage
1个回答
0
投票

由于您存储数据的方式,任何查询都将返回整个对象。现在,您只需使用所选的编程语言在本地查询该对象。

要让MongoDB完成工作,您最好将日期和值对象存储为顶级文档,例如

{
   "d" : ISODate("2006-11-14T00:00:00.000Z"),
   "v" : 10.0
}

如果您需要其他识别信息,可以将其嵌入该文档中。现在找到你可以做的任何值范围,

db.col.find( { "d" : { "$gte" : ISODate("2006-11-29T00:00:00.000Z"), "$lte" :  ISODate("2006-12-01T00:00:00.000Z")}})

那么你可以在代码中总计v值。或者,您可以使用聚合框架。

> match
{
    "$match" : {
        "d" : {
            "$gte" : ISODate("2006-11-29T00:00:00Z"),
            "$lte" : ISODate("2006-12-01T00:00:00Z")
        }
    }
}
> db.col.aggregate( [match, {"$group" : { "_id" : "range_sum", "total" : {"$sum": "$v"}}}])
{ "_id" : "range_sum", "total" : 31.39 }
>

有关详细信息,请参阅$group文档。

我建议在index字段上添加d以使查询更有效。

© www.soinside.com 2019 - 2024. All rights reserved.