我有以下格式的时间序列数据
{
"_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周的收益
答案 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,以提高查询效率。