如何使用MongoDB中的时间序列数据计算收益

时间:2019-03-22 12:21:27

标签: mongodb time-series percentage

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

{
    "_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计算最近1周的收益

1 个答案:

答案 0 :(得分: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文档。

我确实建议在d字段上添加一个index,以提高查询效率。