Объединение MongoDB с PHP - группировка по дате

Я использую aggregate в MongoDB с PHP. Код выглядит так:

$results = $c->aggregate(array(
    array(
      '$project' => array(
          'day' => array('$dayOfYear' => '$executed')
      ),
    ),
    array(
      '$group' => array(
          '_id' => array('day' => '$day'),
          'count' => array('$sum' => 1)
      ),
    ),
    array(
      '$sort' => array(
          '_id' => 1
      ),
    ),
    array(
      '$limit' => 30
    )
));

Проблема в том, что $dayOfYear не сортирует правильно, потому что сортирует 2, затем 3, затем 345, 346... Мне нужно, чтобы дата сортировалась по возрастанию. Итак, вместо того, чтобы просто делать $dayOfYear, мне нужно что-то вроде $year-$month-$dayOfMonth.

К сожалению, это не работает. Любые идеи?

Спасибо.


person Justin    schedule 05.01.2013    source источник


Ответы (2)


Вы можете спроецировать эти части, а затем сгруппировать их, чтобы вы могли сгруппировать всю дату:

$results = $c->aggregate(array(
    array(
      '$project' => array(
          'year' => array('$year' => '$executed' ),
          'month' => array('$month' => '$executed' ),
          'day' => array('$dayOfMonth' => '$executed')
      ),
    ),
    array(
      '$group' => array(
          '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
          'count' => array('$sum' => 1)
      ),
    ),
    array(
      '$sort' => array(
          '_id.year' => 1,
          '_id.month' => 1,
          '_id.day' => 1
      ),
    ),
    array(
      '$limit' => 30
    )
));

Что-то вроде этого должно помочь вам сортировать, как вы сказали: $year-$month-$dayOfMonth.

person Sammaye    schedule 05.01.2013
comment
Спасибо, это сработало отлично. Есть ли способ на уровне MongoDB включить дни с 0 строками. В основном я хочу отображать последние 30 дней, но приведенное выше возвращает 30 строк, а не последние 30 дней. - person Justin; 05.01.2013
comment
@Justin Хороший вопрос, однако не из того, что я знаю, из-за того, что я полагаюсь на дату строк, чтобы фактически заполнить строки. Я считаю, что вам нужно будет сделать эту клиентскую сторону в настоящее время. - person Sammaye; 05.01.2013
comment
@Sammaye - я предложил и отредактировал приведенный выше код. Ваш текущий код как есть .i.e. '$sort' => ['_id' => 1] будет сортировать его только по дням и приведет к следующему порядку - 1/10/2015 ,2/10/2015, 4/9/2015, 6/9/2015... and so on. - person Shalom Sam; 02.10.2015

Вы не должны сортировать по всему _id, потому что вы настроили его так, чтобы он содержал объект (который может сортироваться странно), поэтому измените свой $sort на это вместо того, чтобы специально сортировать по дням года:

  '$sort' => array(
      '_id.day' => 1
  ),
person JohnnyHK    schedule 05.01.2013