2013-03-14 5 views
1

Я родом из SQL мира, и до сих пор учится запрос MongoDB, и я столкнулся с этой проблемой ...MongoDB Запрос на поле последнего документа в гнездовой массив

Установка:

У меня есть коллекция Студент, который имеет множество совещаний

student: { 
    meetings: [ 
    {time: x}, 
    {time: y}, 
    {time: z} 
    ] 
} 

встречи массив имеет динамический размер, а его элементы сортируются по времени в ИСС, так что первая встреча в массиве будет иметь самое раннее время.

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

db.students.find({ "meetings.0.time": {$gt: ISODate()} }) 

Вопрос:

Теперь мне нужно запросить, чтобы получить все студенты, чьи ПОСЛЕДНИЙ встреча начинается до некоторое время. Однако следующее не было выполнено:

db.students.find({ "meetings.-1.time": {$lt: ISODate()} }) 

Как вы решите эту проблему?

+0

Невозможно правильно ответить на телефон. Купите, вы сможете сделать это, используя структуру агрегации. Посмотрите на документы mongodb. – sambomartin

+1

Если последний раз меньше даты, то все времена в массиве будут меньше этой даты. может быть, встречается.forEach.time будет работать? –

+1

«ПОСЛЕДНИЕ» по положению в массиве или «ПОСЛЕДНИЕ», как в «последнем»? –

ответ

1

Это работает для вас?

db.student.aggregate(
    { $unwind : "$meetings" }, 
    { $group : { _id: "$_id", lastMeeting : { $max : "$meetings.time" }}}, 
    { $match: { lastMeeting : { $lt : IsoDate(...) } } 
); 
+0

Как бы вы это изменили, чтобы фактически выбрать последний элемент в массиве, вместо использования $ max? – haejeong87

+1

это невозможно (пока) с использованием структуры агрегации. Есть несколько билетов на jira, относящихся к этому https://jira.mongodb.org/browse/SERVER-4589, и я думаю, что это было бы полезно https://jira.mongodb.org/browse/SERVER-6074. Альтернативные методы, которые я видел, состоят в том, чтобы удерживать последовательность/порядок как атрибут в каждом элементе (встреча) - есть примеры создания последовательности на примерах mongodb. Если вы с удовольствием сделаете некоторую обработку в приложении, вы можете использовать $ slice http://docs.mongodb.org/manual/reference/projection/slice/. Другой способ - сохранить копию «lastMeeting» рядом с массивом. – sambomartin

+1

Вы также можете использовать ObjectId для каждой встречи - это уникально и последовательно. ** – sambomartin

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