4

我正在使用aggregatein MongoDBwith 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

不幸的是,这不起作用。有任何想法吗?

谢谢。

4

2 回答 2

3

您可以将这些部分投影出来,然后对它们进行分组,以使您能够对整个日期进行分组:

$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.

于 2013-01-05T03:25:09.173 回答
0

您不应该对整体进行排序,_id因为您已将其设置为包含一个对象(可能会奇怪地排序),因此请将您的更改$sort为此改为专门按一年中的某天排序:

  '$sort' => array(
      '_id.day' => 1
  ),
于 2013-01-05T03:40:08.870 回答