JCB*_*JCB 4 mongodb mongodb-query aggregation-framework
我正在使用MongoDB来存储时间序列数据,使用与"面向文档的设计"类似的结构来解释:http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data -in-的MongoDB
目标是查询整个系统当天最繁忙的十分钟.每个文档使用60个子文档(每分钟1个)存储1小时的数据.每分钟存储嵌入在"vals"字段中的各种度量.我关心的指标是"订单".示例文档如下所示:
{
"_id" : ObjectId("54d023802b1815b6ef7162a4"),
"user" : "testUser",
"hour" : ISODate("2015-01-09T13:00:00Z"),
"vals" : {
"0" : {
"orders" : 11,
"anotherMetric": 15
},
"1" : {
"orders" : 12,
"anotherMetric": 20
},
.
.
.
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,系统中有许多用户.
我通过使用以下组对象进行聚合,设法使结构变平(有些):
group = {
$group: {
_id: {
hour: "$hour"
},
0: {$sum: "$vals.0.orders"},
1: {$sum: "$vals.1.orders"},
2: {$sum: "$vals.2.orders"},
.
.
.
}
}
Run Code Online (Sandbox Code Playgroud)
但是这只给了我24个文件(每小时1个),在那个小时内每分钟的订单数为#,如下所示:
{
"_id" : {
"hour" : ISODate("2015-01-20T14:00:00Z")
},
"0" : 282086,
"1" : 239358,
"2" : 289188,
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
现在我需要以某种方式获得当天的前10分钟,但我不确定如何.我怀疑它可以用$ project完成,但我不确定如何.
您可以聚合为:
$match 具体日期的文件.$group和$project对象.$group通过$hour,在数组中每小时每小时累积所有文档.保留文档中某处的分钟.$project$setUnion每小时所有文件的变量文档.$unwind 文件.$sort 通过 orders$limit10我们需要的顶级文件.码:
var inputDate = new ISODate("2015-01-09T13:00:00Z");
var group = {};
var set = [];
for(var i=0;i<=60;i++){
group[i] = {$push:{"doc":"$vals."+i,
"hour":"$_id.hour",
"min":{$literal:i}}};
set.push("$"+i);
}
group["_id"] = {$hour:"$hour"};
var project = {"docs":{$setUnion:set}}
db.t.aggregate([
{$match:{"hour":{$lte:inputDate,$gte:inputDate}}},
{$group:group},
{$project:project},
{$unwind:"$docs"},
{$sort:{"docs.doc.orders":-1}},
{$limit:2},
{$project:{"_id":0,
"hour":"$_id",
"doc":"$docs.doc",
"min":"$docs.min"}}
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2789 次 |
| 最近记录: |