2015-04-01 3 views
6

У меня есть коллекция образцов articles, которая содержит следующие данные:

/* 0 */ 
{ 
    "_id" : "post 1", 
    "author" : "Bob", 
    "content" : "...", 
    "page_views" : 5 
} 

/* 1 */ 
{ 
    "_id" : "post 2", 
    "author" : "Bob", 
    "content" : "...", 
    "page_views" : 9 
} 

/* 2 */ 
{ 
    "_id" : "post 3", 
    "author" : "Bob", 
    "content" : "...", 
    "page_views" : 8 
} 

Я хотел бы использовать структуру агрегации, чтобы найти минимальное и максимальное значение для страницы просмотров для данного автора, и в процессе отображает _id статьи со значением min/max. Это мой ожидаемый результат:

{ _id : "Bob", 
    value : { min : { page_views : 5 , _id : "post 1" } , 
      max : { page_views , 9 , _id : "post 3" } } } 

Я попытался реализации этого агрегацию трубопровода:

db.articles.aggregate([ 
    { 
     "$group": { 
      "_id": "$author", 
      "min_page_views": { 
       "$min": "$page_views" 
      }, 
      "max_page_views": { 
       "$max": "$page_views" 
      } 
     }    
    }, 
    { 
     "$project": { 
      "_id": 1, 
      "min": { 
       "page_views": "$min_page_views", 
       "_id": "$_id"     
      }, 
      "max": { 
       "page_views": "$max_page_views", 
       "_id": "$_id"     
      } 
     } 
    } 
]) 

Выход:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : "Bob", 
      "min" : { 
       "page_views" : 5, 
       "_id" : "Bob" 
      }, 
      "max" : { 
       "page_views" : 9, 
       "_id" : "Bob" 
      } 
     } 
    ], 
    "ok" : 1 
} 

Я не могу показаться, чтобы получить другое поле max._id или min._id, который дает исходный идентификатор документа перед проекцией. Как мне изменить конвейер агрегации, чтобы я мог включить это поле?

ответ

5

Вы можете изменить свой aggregate трубопровод, как показано ниже:

  • Включите $sort этап до вашего оператора $group стадии, чтобы получить записи в порядке возрастания.

  • Затем получить $first и $last записей в группе , которая будет проводить lowest и highest просмотренных страниц соответственно, для каждого автора.

$$ROOT является системной переменной, которая используется для обозначения элемента верхнего уровня, в настоящее время обрабатываемого документа.

Модифицированный код:

db.articles.aggregate([ 
{$sort:{"page_views":1}}, 
{$group:{"_id":"$author", 
     "max":{$last:"$$ROOT"}, 
     "min":{$first:"$$ROOT"}}}, 
{$project:{"max.page_views":1, 
      "max._id":1, 
      "min.page_views":1, 
      "min._id":1}} 
]) 

образца о/р:

{ 
     "_id" : "Bob", 
     "max" : { 
       "_id" : "post 2", 
       "page_views" : 9 
     }, 
     "min" : { 
       "_id" : "post 1", 
       "page_views" : 5 
     } 
}