2014-12-24 2 views
1

Предположим, у меня есть status и поле createdAt и еще несколько полей, таких как title и content.MongoDB возвращает последние документы из каждой категории в одном операторе поиска?

Поле статуса может принимать значения open, closed, or pending.

Я в основном хочу вернуть 5 последних документов от каждое значение статуса в одном операторе поиска. Это возможно? Кроме того, это можно сделать без aggregate?

Если да, то как?

ответ

0

Попробуйте следующие

db.collectionName.find().sort({"_id":-1}).limit(5).pretty() 

Это возвращающие-х последних пяти документов

+0

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

0

Плохая новость: это не возможно с основными запросами. По простой причине: вы можете ограничить только полный набор результатов. Поэтому даже когда вы используете логику OR в поле статуса, первые двадцать документов вашего результирующего набора вполне могут иметь статус «закрыто». Когда вы применяете все ограничения этого набора результатов, до первых двадцати документов будет статус «закрыт».

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

+0

Yup, вот почему я думал, что оставлю это до экспертов mongodb. Я уверен, что это можно сделать с помощью агрегатов, поэтому, если вы можете найти решение, которое использует агрегаты, это тоже хорошо. – user1952811

0

Markus правый. К сожалению, это невозможно сделать в один запрос агрегирования из-за отсутствия фрагмент операция в проекте этап конвейера агрегации.

Это означает, что вы могли бы легко группировать документы по статусу, как это:

db.collectionName.aggregate([   
     { "$group": { 
      "_id": "$status", 
      "docs": { "$push": "$title" } 
     }} 
    ]); 

но есть не способ порезать в результате подмассивы во время этой агрегации. Эта функция была requested, но еще не реализована.

Вы можете отрезать его после агрегации с помощью отдельной команды. Или у вас всегда есть возможность использовать Map-Reduce.

Другой вариант - перебрать статусы в приложении и запросить документы по каждому статусу. Я бы пошел с этим решением в вашем сценарии, потому что у вас всего 3 разных статуса. Это означает только 3 запроса. Это не смертельно (особенно если у вас есть индекс в поле состояния).

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