当前位置: 首页 > 知识库问答 >
问题:

MongoDB根据_id统计每分钟的新文档数

都博裕
2023-03-14

我想统计一下每分钟存储的新文档数量。

由于带有标准ObjectID的_id字段已经包含文档创建的时间戳,我认为应该可以以某种方式使用它。

在Stackoverflow上,我发现了以下映射缩减代码,以便在创建数据有专用字段时完成它

地图-减少每分钟的文档数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实现

共有1个答案

岳景明
2023-03-14

你确实可以用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
}
 类似资料:
  • 如问题所述,我无法使此更新操作正常工作。 我的设想: 我有一个、一个和一个。和具有数组作为属性。 我需要达到的目标是: > 将同一票据的属性从1递减。在主

  • 我在MongoDB中使用Java驱动程序。我有一个集合中的文档id列表。我想在每个文档中更新一个字段,该文档的“\u id”等于列表中的一个文档id。在下面的示例中,我尝试了以下方法: 我的目的是用\u id=123、\u id=456和\u id=789更新文档,将其“field”属性设置为59。 我这样做对吗?

  • 问题内容: 我正在尝试通过ID选择文档 我试过了: 还尝试了: 这给我一个错误500 … 这些都不起作用。如何通过_id选择? 问题答案:

  • 如何使用_id检索在我的收藏中创建的最新文档? 我试图通过以下方式在我的Web应用程序中实现分页: 正在检索我页面加载的最后一个文档的_id 在下一页中检索大于最后一个文档_id的文档(http://tldrify.com/dcj) 我采用这种方法的原因是,我试图利用存储数据中的自然顺序——文档中存储的id。 获取下一组帖子的示例: 我的猫鼬模式: 据我所知,Mongo的文件已经按照以下文件从最旧

  • 本文向大家介绍python操作mongodb根据_id查询数据的实现方法,包括了python操作mongodb根据_id查询数据的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python操作mongodb根据_id查询数据的实现方法。分享给大家供大家参考。具体分析如下: _id是mongodb自动生成的id,其类型为ObjectId,所以如果需要在python中通过_id查询,

  • 多亏了这里的人的帮助,我成功地在我的文档中找到了两个ID,并在另一个集合中找到了他们的代表文档。我需要采取的下一步是进一步查找一个“嵌套”ID(引用另一个集合中的文档)。 其结果如下: 我希望chieftain部分是这样的(这就是没有添加'last'$lookup'的chieftain文档的样子):