2011-05-25 114 views
6

查詢文檔中嵌入式文檔的好方法是什麼?例如,我的用戶文檔具有嵌入的警報文檔。如果我想看看如果給定的用戶有一個警報,名字我可以做兩種方式,據我可以告訴 - 在內存中拉使用MongoMapper查詢文檔中的嵌入式文檔

alert = current_user.alerts.select{|a| a.name == params[:name]}.first

或通過實際的文檔界面LA(請注意,我不是100%肯定這是語義上有效,但你明白了吧):

User.where('alerts.name' => params[:name], :id => current_user.id).first

必須有一個更好的辦法,像

current_user.alerts.where(:name => params[:name])

也許?或者,也許我只是沒有考慮這個問題吧?

+0

對不起,我不能直接(沒有足夠的經驗,映射器)回答你的問題,但看[勇敢的(https://開頭的github的.com/jnunemaker /勇敢的)。它是MongoDB之上的一個查詢語言,也許它可以爲你提供更簡潔的語法。 – 2011-05-25 16:40:19

回答

0

沒有。我認爲這是動機:

在MongoMapper中,對數據庫的查詢總是返回一個根對象。如果允許查詢返回嵌入式文檔而沒有其父文件,則會導致這種情況中斷並使許多事情變得更加複雜(如果我在該嵌入式文檔中調用了.parent,該怎麼辦?),所以MongoMapper在簡單性方面發生了錯誤,並且不會假裝事情是他們不是的。嵌入式文檔存儲在MongoDB的根文檔內的數組中,因此MongoMapper在Ruby中爲您提供了一個數組。

所以你做這件事的兩種方式是做它的目的。

如果你需要一些語法suger,它不應該太難編碼。你可以擴展Array,或者你可以編寫一個插件來擴展MongoMapper的proxy for embedded docs

-1

您可以執行:

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).first.alerts.select{|u| u.name == params[:name]} 

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).alerts.select{|u| u.name == params[:name]}.first 
+0

是的。沒有選擇答案,這確實是做到這一點的唯一方法。另外,如果它是一個嵌入式文檔,那麼最佳實踐不應該有很多條目。 – 2015-01-22 21:11:46

+0

我不知道你爲什麼在這裏抱怨?目前只有一種方法可以做OP所要求的,就是這樣。如果你有問題,爲什麼不創建一個新的mongo寶石或解決這個問題?是的,就像我說過的,如果你有很多項目,比如警報,他們不應該被最佳實踐所嵌入。但OP沒有要求最佳實踐或意見,只是爲了回答他的問題... – 2015-01-22 21:17:14

+0

在那裏我添加了一個新的選擇,現在離開,如果你沒有什麼可以添加... – 2015-01-22 21:30:04