2013-08-06 3 views
0

У меня есть коллекция Монго с документами, как ниже:Найти документ с его окружением в MongoDB

{ 
    _id: [ObjectId] 
    writeDate: [DateTime] 
    publishDate: [DateTime] 
    ... 
} 

Я обычно список отображения таких документов сортировки по publishDate первым, а затем на writeDate.

Теперь, когда я получаю заданный документ _id Мне нужно получить список, содержащий: 2 предыдущих документа, этот документ и 2 следующих документа. Так оно и должно выглядеть следующим образом:

[1,2,4,3,6,7,8,5,9,0] 

если данный идентификатор 6 я должен получить

[4,3,6,7,8] 

и если идентификатор 4 я должен получить

[1,2,4,3,6] 

Дело в том, что публиковать даты могут быть одинаковыми (тогда я дополнительно сортирую по writeDate), поэтому, я полагаю, я не могу просто заказать $gte и $lte с датой данного документа. А также _id не гарантируются.

У вас есть ключи к тому, как это сделать?

+0

Там что-то я не понимаю, в вашем вопросе: вы говорите, что вы не можете сортировать основе по дате, поскольку несколько документов могут иметь одну и ту же дату. Если нет порядка сортировки, нет таких вещей, как следующие два и два предыдущих документа. Или вы сортируете свои документы по '_id'? –

+0

Отредактировал мой вопрос. Я имел в виду, что 'publishDate' может быть одинаковым на нескольких документах, поэтому у меня есть orderAsc (publishDate) и orderAsc (writeDate). –

+0

Можно ли дублировать даты публикации и записи? – WiredPrairie

ответ

0

Вы не можете сделать это в одном запросе, но вам придется использовать три вместо:

// current 
r = db.so.findOne({ _id: 6 }); 

// previous 2 
db.so 
    .find({ publishDate: { $lte: r.publishDate }, _id: { $ne: 6 }) 
    .sort({ publishDate: -1 }) 
    .limit(2); 

// next 2 
db.so 
    .find({ publishDate: { $gte: r.publishDate }, _id: { $ne: 6 }) 
    .sort({ publishDate: 1 }) 
    .limit(2);