2012-05-10 97 views
6

如何在Ruby on Rails中檢查使用mongoid的文檔是否存在嵌入式文檔?假設我有一個文件user,它具有name,email,並且可能有nicknames嵌入式文檔。現在,如果我運行user.first.nicknames,並且該user中沒有嵌入文檔nicknames,則會出錯。我試過matches?exists?但他們不工作。如何檢查mongoid中的文檔中是否存在嵌入式文檔?

謝謝!

回答

3

這應該返回true,如果它不存在User.first.nicknames.nil?它,如果它存在,這將返回true:User.first.nicknames.present?

+0

這些都不適用於沒有'暱稱'的mongoDB文檔。它產生一個「NoMethodError:未定義的方法'暱稱'」錯誤。這對確實有'暱稱'的文檔起作用.. – Goalie

+0

這不是我的,我正在使用MongoId 2.3.3。在我看來,'User.first'實際上是零。所以你試圖在一個零對象上調用'nicknames'。你能證實嗎? – ctcherry

0

應儘可能簡單{"user":{"$exists":"nicknames"}}

+0

這是一個mongo shell命令嗎?我正在尋找Ruby on Rails中的解決方案。 – Goalie

2

你可以做User.where(:nicknames.exists => true).include?(user)

User.where(:nicknames.exists => true)將僅返回包含nicknames的文檔。

8

從這裏的其他答案得到一些幫助後,我發現了一些對我有用的東西,我認爲這是原始海報的想法;

Model.where(:"subdoc.some_attribute".exists => true) 

這將返回子文檔中存在「some_attribute」的所有文檔。 注意符號的語法,這就是我所缺少的。

+0

您也可以通過關聯:'Model.subdocs.where(:field.exists => true)'。 –

+0

這就是我一整天都在尋找的東西。它沒有記錄在任何地方!? – fre2ak