2016-06-09 4 views
1

Это как моя структура коллекции выглядит следующим образом:Group и сумма изо дня в день

{ 
    "_id" : ObjectId("57589d2a9108dace306602b8"), 
    "IDproject" : NumberLong(53), 
    "email" : "[email protected]", 
    "dc" : ISODate("2016-06-06T22:33:13.000Z") 
} 

{ 
    "_id" : ObjectId("57589d2a9108dace306602b8"), 
    "IDproject" : NumberLong(53), 
    "email" : "[email protected]", 
    "dc" : ISODate("2016-06-07T22:33:13.000Z") 
} 

{ 
    "_id" : ObjectId("57589d2a9108dace306602b8"), 
    "IDproject" : NumberLong(53), 
    "email" : "[email protected]", 
    "dc" : ISODate("2016-06-078T22:33:13.000Z") 
} 

Как вы можете видеть, есть два клиента добавлено 7 июня и один на 6 июня. Я хотел бы группировать и суммировать эти результаты за последние 30 дней.

Это должно выглядеть примерно так:

{ 
    "dc" : "2016-06-05" 
    "total" : 0 
} 

{ 
    "dc" : "2016-06-06" 
    "total" : 1 
} 

{ 
    "dc" : "2016-06-07" 
    "total" : 2 
} 

As, вы можете видеть, нет никаких записей по 6 июня, так что это ноль. Она должна быть равна нулю для 5-го июня, и т.д.

Это было бы дело № 1, а дело № 2 являются следующие результаты:

{ 
     "dc" : "2016-06-05" 
     "total" : 0 
    } 


    { 
     "dc" : "2016-06-06" 
     "total" : 1 
    } 


    { 
     "dc" : "2016-06-07" 
     "total" : 3 
    } 

Я попытался это:

db.getCollection('customer').aggregate([ 
{$match : { IDproject : 53}},  
{ $group: { _id: "$dc", total: { $sum: "$dc" } } }, ]); 

Но кажется сложным. Я впервые работаю с базой данных noSQL.

Спасибо.

+0

Хорошо. Это намного лучше: 'db.getCollection ('customer'). Aggregate ([ {$ match: {IDproject: 53}}, {$ group: {_id:" $ dc ", всего: {$ sum : 1}}}, ]); ' Просто нужно выяснить, как добавить ноль к общему числу, и получить только последние 30 дней, но случай 2 # все еще там. – Nedim

+0

Почему вы заботитесь о днях за последние 30 дней, когда нет записи? – styvane

+0

Потому что мне нужно показать это на графике. – Nedim

ответ

0

Вот как вы получите ежедневные подсчеты (общая идиома для подсчета строк равна {$sum: 1}).

Однако вы не можете получить нули в течение дней, в которых отсутствуют данные, потому что нет данных, которые давали бы ключ группировки в эти дни. Вы должны обрабатывать эти случаи на PHP, создавая список датированных дат и затем просматривая, есть ли данные для каждой даты.

db.getCollection('customer').aggregate([ 
    {$match : { IDproject : 53}},  
    {$group: { 
     _id: {year: {$year: "$dc"}, month: {$month: "$dc"}, day: {$dayOfMonth: "$dc"}}}, 
     total: {$sum: 1} 
    }}, 
]); 

Следует отметить, что MongoDB работает только в часовом поясе UTC; нет операторов агрегирования конвейера, которые могут надежно преобразовывать временные метки в локальные часовые пояса. Операторы $year, $month и $dayOfMonth указывают дату в UTC, которая может быть не такой, как в локальном часовом поясе. Решения включают в себя:

  1. сохранения меток времени в локальной временной зоне (= ложь MongoDB, что они находятся в UTC)
  2. спасая смещение часового пояса с меткой времени,
  3. экономии местный год, месяц и DayOfMonth с отметка времени.
Смежные вопросы