我有以下格式的时间序列数据
{
"_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完成工作,您最好将日期和值对象存储为顶级文档,例如
{
"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
以使查询更有效。