2013-11-27 5 views
2

Im пытается получить сгруппированный/агрегированный результат в Mongodb.MongoDb aggregate by embedded document

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

Array(
[_id] => 529474f4adcc2bb25b662f2f 
[lists] => Array 
    (
     [0] => Array 
      (
       [_id] => 529466c8adcc2b5a5b662f13 
       [name] => List 4 
       [status] => active 
       [changed_at] => 1385460980 
      ) 

     [1] => Array 
      (
       [_id] => 529466c8adcc2b5a5b662f12 
       [name] => List 3 
       [status] => inactive 
       [changed_at] => 1385460980 
      ) 

    ) 

[name] => Name 20) 

Я хочу, чтобы получить результат, который будет рассчитывать неактивных пользователей, сгруппированных по месяцам на основе changed_at.

я могу получить результаты, как таким образом:

$ops = array(
    array(
     '$match' => array(
      'lists.status' => 'inactive' 
     ) 
    ) 
); 
$unsubYearStats = $c->aggregate($ops); 

Вопрос в том, как я могу использовать $group к группе совпавшего элемента? (В этом случае поле Листа 3 "changed_at")

Что-то вроде:

'$group' => array(
    "_id" => array("month" => array('$month' => '-->$matched_subdocument.changed_at<--')), 
    "total" => array('$sum' => 1), 
), 

Спасибо за любые советы.

+0

Можете ли вы использовать синтаксис JSON для объектов MongoDB в своих примерах или добавить тег для языка программирования, который вы используете? – Philipp

ответ

0

Как Парвин указала, оператор $ размотки правильный подход.

Вот мой запрос:

$ops = array(
      array(
        '$unwind' => '$lists' 
      ), 
      array(
        '$match' => array(
          "lists.status" => 'active', 
        ), 
      ), 
      array(
        '$group' => array(
          "_id" => array("month" => array('$month' => '$lists.changed_at'), "year" => array('$year' => '$lists.changed_at')), 
          "total" => array('$sum' => 1), 
        ), 
      ), 
    ); 

первый $ размотки, а затем $ матч, а затем $ группа.

0

Вы можете использовать $match, чтобы найти неактивных пользователей перед группировкой.

Запрос должен быть что-то вроде:

db.myObject.aggregate(
    {$unwind : "$lists"}, 
    {$match : {"lists.status" : "inactive"}}, 
    {$group : /* write group query here*/} 
); 
+0

Thats, что я делаю. Но мне нужно группировать «lists.changed_at». Как вы видите, есть несколько встроенных документов, и мне нужно объединить поле 'changed_at' в согласованном документе. –

+0

Вы можете проверить оператор $ unwind. Это должно решить вашу проблему. –

+0

Это похоже на хорошее направление ... Тогда я отвечу на мой вопрос. –