sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB cuenta el número de documentos nuevos por minuto según _id

Puedes hacer esto con M/R de hecho. getTimestamp() funciona en M/R ya que se ejecuta en JavaScript en el servidor, no importa si el idioma de su cliente es PHP o 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();

Que genera algo como:

{ "_id" : ISODate("2013-08-05T15:24:00Z"), "value" : { "count" : 9 } }
{ "_id" : ISODate("2013-08-05T15:26:00Z"), "value" : { "count" : 2 } }

Sin embargo, le sugiero que no use M/R pero en su lugar, recurra al marco de agregación, ya que es mucho más rápido porque puede usar índices y ejecutarse simultáneamente. En este momento, el A/F no tiene un operador para obtener la marca de tiempo de un ObjectID campo todavía, así que podrás tiene que almacenar la hora en el momento de la inserción también. fe con documentos como este:

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 }
    } } 
] );

Qué salidas:

{
    "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
}