Как сгруппировать по секундам без десятичной части ISODate в MongoDB

Я хотел запросить базу данных, чтобы найти количество сообщений в секунду, чтобы ввести их в график, чтобы показать тенденцию активности. Я использую spring-data-mongo, но пока первый шаг — сделать это в оболочке mongo, прежде чем беспокоиться о том, как это сделать из java.

Я использовал структуру агрегации, как показано ниже:

 db.post.group({
key:{dateCreated: 1},
cond: { dateCreated:
        {
          "$gt": new ISODate("2013-08-09T05:51:15Z"),
          "$lt": new ISODate("2013-08-09T05:51:20Z")
        }
      },
reduce: function(cur, result){
   result.count += 1
},
 initial: {count:0}
})

Результат обнадеживает, но кажется, что из-за десятичной части ISODate счет кажется неправильным, поскольку он группируется в секунды с десятичным числом, делающим каждый счет равным 1.

 [
{
    "dateCreated" : ISODate("2013-08-09T05:51:15.332Z"),
    "count" : 1
},
{
    "dateCreated" : ISODate("2013-08-09T05:51:15.378Z"),
    "count" : 1
},
{
    "dateCreated" : ISODate("2013-08-09T05:51:15.377Z"),
    "count" : 1
},
 // many more here
 ]

Есть ли способ просто рассмотреть только часть секунд, как в результате, как показано ниже:

 [
{
    "dateCreated" : ISODate("2013-08-09T05:51:15Z"),
    "count" : 5
},
{
    "dateCreated" : ISODate("2013-08-09T05:51:16Z"),
    "count" : 8
},
{
    "dateCreated" : ISODate("2013-08-09T05:51:17Z"),
    "count" : 3
},
{
    "dateCreated" : ISODate("2013-08-09T05:51:18Z"),
    "count" : 10
},
{
    "dateCreated" : ISODate("2013-08-09T05:51:19Z"),
    "count" : 2
},
{
    "dateCreated" : ISODate("2013-08-09T05:51:20Z"),
    "count" : 13
} 

 ]

Спасибо, что прочитали это.


person black sensei    schedule 08.09.2013    source источник
comment
Почему бы не использовать структуру агрегации: docs.mongodb.org/manual/ ссылка/агрегация/секунда/ ? Он действительно поддерживает сегментирование для одного и не является JS.   -  person Sammaye    schedule 08.09.2013
comment
спасибо за указание на правильное направление   -  person black sensei    schedule 08.09.2013


Ответы (1)


Для тех, кто в такой же ситуации. вот как я изменил свой запрос. Спасибо @Sammaye.

db.post.aggregate(
{
  $match: { dateCreated:
                    {
                      "$gt": new ISODate("2013-08-09T05:51:15.000Z"),
                      "$lt": new ISODate("2013-08-09T05:51:20.000Z")
                    }
           }
},
{ 
  $group: {
        _id: {
            hour: {$hour: "$dateCreated"},
            minute: {$minute: "$dateCreated"},
            second: {$second: "$dateCreated"}   
        },
        cnt: {$sum : 1}
       }
}
)
   {
"result" : [
    {
        "_id" : {
            "hour" : 5,
            "minute" : 51,
            "second" : 19
        },
        "cnt" : 26
    },
    {
        "_id" : {
            "hour" : 5,
            "minute" : 51,
            "second" : 18
        },
        "cnt" : 29
    },
    {
        "_id" : {
            "hour" : 5,
            "minute" : 51,
            "second" : 17
        },
        "cnt" : 27
    },
    {
        "_id" : {
            "hour" : 5,
            "minute" : 51,
            "second" : 16
        },
        "cnt" : 25
    },
    {
        "_id" : {
            "hour" : 5,
            "minute" : 51,
            "second" : 15
        },
        "cnt" : 16
    }
],
"ok" : 1
   }
person black sensei    schedule 08.09.2013