2013-03-14 58 views
1

我來自SQL世界,還在學習MongoDB的查詢,而我面對這個問題......MongoDB的查詢上嵌套數組中最後一個文檔的領域

設置:

我有一個它有會議的數組學生收集

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

會議陣列具有動態的大小,它的元素由ASC時間排序,所以數組中的第一次會議將有最早的時候。

我能夠查詢得到所有學生的第一次會議通過一定時間後開始:

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

問:

現在我還需要查詢獲得所有學生的最後一次會議開始前一定的時間。但是,以下內容不起作用:

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

你們會如何解決這個問題?

+0

無法從手機正確回答。購買你將能夠使用聚合框架來做到這一點。看看mongodb文檔。 – sambomartin 2013-03-14 23:25:13

+1

如果最後一次少於日期,那麼數組中的所有時間將小於該日期。也許meet.forEach.time會工作? – 2013-03-14 23:37:14

+1

「LAST」按陣列排列或「LAST」按「最新」排序? – 2013-03-14 23:50:55

回答

1

這是否適合您?

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

你會如何改變這個實際選擇數組中的最後一個元素,而不是使用$ max? – haejeong87 2013-03-20 00:49:04

+1

這是不可能的(但)使用聚合框架。有幾個與這個https://jira.mongodb.org/browse/SERVER-4589相關的jira門票,我認爲這將是有用的https://jira.mongodb.org/browse/SERVER-6074。我見過的另一種方法是將序列/順序作爲每個元素(會議)中的一個屬性 - 有一些在mongodb示例中創建序列的示例。如果你很樂意在應用中做一些處理,你可以使用$ slice http://docs.mongodb.org/manual/reference/projection/slice/。另一種方法是在數組旁邊放置一個「lastMeeting」副本 – sambomartin 2013-03-20 23:22:41

+1

您也可以在每個會議中使用一個ObjectId - 這是唯一且連續的** – sambomartin 2013-03-20 23:23:36