我想创建一个关于每分钟存储多少新文档的统计信息。
由于带有标准ObjectID的_id字段已包含文档创建的时间戳,我认为应该可以以某种方式使用它。
在Stackoverflow上,我找到了以下地图缩减代码,以便在创建数据的专用字段时完成它
Map-Reduce count number of documents in each minute MongoDB
map = function() {
var created_at_minute = new Date(this.created_at.getFullYear(),
this.created_at.getMonth(),
this.created_at.getDate(),
this.created_at.getHours(),
this.created_at.getMinutes());
emit(created_at_minute, {count: 1});
}
reduce = function(key, values) {
var total = 0;
for(var i = 0; i < values.length; i++) { total += values[i].count; }
return {count: total};
}
根据Mongo DB文档(http://docs.mongodb.org/manual/reference/object-id/),应该可以通过调用ObjectId(“507f191e810c19729de860ea”)来获取_id的时间戳.getTimestamp()。
现在我不知道是否可以在map函数中使用此getTimestamp()。
有人知道如何做或有更好的方法吗?
我需要它可以在python或php中实现
答案 0 :(得分:3)
你可以用M / R做到这一点。 getTimestamp()
在M / R中工作,因为它在服务器上以JavaScript运行,无论您的客户端语言是PHP还是Python,都无关紧要:
map = function() {
var datetime = this._id.getTimestamp();
var created_at_minute = new Date(datetime.getFullYear(),
datetime.getMonth(),
datetime.getDate(),
datetime.getHours(),
datetime.getMinutes());
emit(created_at_minute, {count: 1});
}
reduce = function(key, values) {
var total = 0;
for(var i = 0; i < values.length; i++) { total += values[i].count; }
return {count: total};
}
db.so.mapReduce( map, reduce, { out: 'inline' } );
db.inline.find();
输出的内容如下:
{ "_id" : ISODate("2013-08-05T15:24:00Z"), "value" : { "count" : 9 } }
{ "_id" : ISODate("2013-08-05T15:26:00Z"), "value" : { "count" : 2 } }
但是,我建议你不要使用M / R ,而是转向聚合框架,因为它可以更快,因为可以使用索引并同时运行。现在,A / F没有运算符来从ObjectID
字段中获取时间戳,但是 还必须在插入时存储时间。 F.E.有这样的文件:
db.so.drop();
db.so.insert( { date: new ISODate( "2013-08-05T15:24:15" ) } );
db.so.insert( { date: new ISODate( "2013-08-05T15:24:19" ) } );
db.so.insert( { date: new ISODate( "2013-08-05T15:24:25" ) } );
db.so.insert( { date: new ISODate( "2013-08-05T15:24:32" ) } );
db.so.insert( { date: new ISODate( "2013-08-05T15:24:45" ) } );
db.so.insert( { date: new ISODate( "2013-08-05T15:25:15" ) } );
db.so.insert( { date: new ISODate( "2013-08-05T15:25:15" ) } );
db.so.aggregate( [
{ $group: {
_id: {
y: { '$year': '$date' },
m: { '$month': '$date' },
d: { '$dayOfMonth': '$date' },
h: { '$hour': '$date' },
i: { '$minute': '$date' },
},
count: { $sum : 1 }
} }
] );
哪个输出:
{
"result" : [
{
"_id" : {
"y" : 2013,
"m" : 8,
"d" : 5,
"h" : 15,
"i" : 25
},
"count" : 2
},
{
"_id" : {
"y" : 2013,
"m" : 8,
"d" : 5,
"h" : 15,
"i" : 24
},
"count" : 5
}
],
"ok" : 1
}