2014-10-23 4 views
0

Я следующие документы в моей коллекцииМонго Aggregation

{ 
    "_id": ObjectId("54490b8104f7142f22ecc97f"), 
     "title": "Sample1", 
     "slug": "samplenews", 
     "cat": "sports", 
     "desc": "sampletextsampletext", 
     "published_date": ISODate("2014-10-23T14:06:57.0Z"), 

} { 
    "_id": ObjectId("54490b8104f7142f22ecc97f"), 
     "title": "Sample2", 
     "slug": "samplenews2", 
     "category": "entertaintment", 
     "desc": "sampletextsampletext", 
     "published_date": ISODate("2014-10-22T14:06:57.0Z"), 

} { 
    "_id": ObjectId("54490b8104f7142f22ecc97f"), 
     "title": "Sample3", 
     "slug": "samplenews3", 
     "category": "entertaintment", 
     "desc": "sampletextsampletext", 
     "published_date": ISODate("2014-9-22T14:06:57.0Z"), 

} { 
    "_id": ObjectId("54490b8104f7142f22ecc97f"), 
     "title": "Sample4", 
     "slug": "samplenews4", 
     "category": "other", 
     "desc": "sampletextsampletext", 
     "published_date": ISODate("2014-10-22T14:06:57.0Z"), 

} 

мне нужно один запрос, чтобы получить 5 топ последних новостей из каждого предложения category.any?

ответ

1

Предполагая, что у вас есть последняя версия MongoDB установлен, один из способов сделать это:

  • Sort запись, основанной на published_date в порядке убывания.
  • group записи на основе их category. Для каждой группы собирайте все записи вместе в массиве.
  • В коде javascript/client, slice 5 лучших записей каждой группы (категории).

$slice не доступен в стороне сервера $project агрегации оператора трубопровода, который удерживает нас от выполнения операции на стороне сервера.

var result = db.collection.aggregate(
[ 
{$sort:{"published_date":-1}}, 
{$group:{"_id":"$category","values":{$push:"$$ROOT"}}} 
] 
).map(function(doc){ 
return {"category":doc._id,"records":doc.values.slice(0,5)}; 
}); 

Переменная result теперь будет массивом документов. Каждый документ представляет каждый category и, в свою очередь, имеет массив верхних 5 записей.

+0

Спасибо, что работает. –

0

Вы можете сортировать, а затем ограничивать свой запрос.

$top_five_other = iterator_to_array($db->find(array('category'=>'other')->sort(array('published_date'=>-1))->limit(5)); 
+0

так что я должен написать 5 запросов, если у меня есть 5 категорий? –

+0

Насколько я знаю, да. Может быть способ бросить их все в один запрос, чтобы вы могли проверить расширенную документацию запроса. –

1

вы можете попробовать совокупный запрос

1-db.collection.aggregate ({$ группа: {_id: {категории: "$ категории"}, всего: {$ Сумма: 1}}}, {$ сортировать: {_ ID: 1}})

ИЛИ

db.collection.aggregate ({$ группа: {_id: {категории: "$ категории"}, всего: {$ сумма: 1}}} {$ сортировать: {_ ID: 1}}) .. Foreach (функция (myDoc) { печать (myDoc._id.category);

})

Смежные вопросы