2012-12-05 12 views
3

我有一個mongo存儲「task」,它有一個數組「answers」,該數組帶有一個散列,其元素是時間戳。所以:Mongo Newbie:最近的子散列在一定時間範圍內具有一個值的條目數

task -> 
    project_id, 
    answers -> 
    [ 
     { 
     timestamp: <time>, 
     question_1: <answer_1>, 
     question_2: <answer_2> 
     }, 
     { 
     timestamp: <time>, 
     question_1: <answer_1>, 
     question_2: <answer_2> 
     }, 
    ] 

我希望做的是獲得具有給定項目ID,並且其最新的應答時間戳字段在過去的24小時之內的所有任務列表。項目ID的東西顯然是非常簡單的,我可以確定一個時間戳是否落在給定的時間段之間,使用$ gte和$ lt ...但是我不知道如何將其範圍限制到最新的時間戳。

我沒有爲此使用ORM - 所以只是簡單的mongo查詢語法首選。

任何意見讚賞。

+1

你將需要做一個map-reduce命令來恢復它;那樣你覺得可以嗎?我可以幫助提供關於它可能看起來像什麼的細節。 – Petrogad

+0

謝謝Petrogad。從快速查看map-reduce,它似乎是必要的選項。如果你可以嘗試打擊一些細節,將不勝感激。 – PlankTon

+0

只要你在Mongo v2.1或更高版本,[聚合框架](http://docs.mongodb.org/manual/applications/aggregation/)就可以很好地處理這個問題。 – JohnnyHK

回答

3

地圖減少,因爲@shelman,提到不是必需的,我不認爲這是最好的方法。請注意,MR並非真正設計爲內聯運行到您自己的應用程序,並且速度很慢(根據定義)。

對於聚合框架(可以很容易地做到這一點)或者更好的是通常的查詢,你通常會更好。

即使您想知道最新項目是否在24小時內回覆,假設任何屬於24小時內的項目答案都應該包括在內,這很可能是一個很好的選擇,因爲這很可能意味着最新的(如果不是那麼爲什麼不呢?)。所以這可以通過(再次如@shelman所述)來實現:

find({project_id: 5, "answers.timestamp": {$gte: ISODate(), $lt: ISODate()}}) 

這將在過去24小時內找到有答案的任何項目。然後你篩選出第一個/最後一個答案(應該始終是你要找的答案),並且你的結果更加高效,並且與你的應用程序內聯。方式

+0

當我說項目我當然有意義的任務,不知道爲什麼我一直在那裏說項目。 – Sammaye

1

我可能會誤解您正在嘗試使用的確切查詢,但我不確定爲什麼您需要爲此減少地圖縮減。 24小時前的複合查詢是否正確project_id和時間戳$gt是否工作?

相關問題