2011-05-21 45 views
2

元素我有兩個型號,一個用戶和Mongoid正則表達式中的數組

class User 
    include Mongoid::Document 
    embeds_many :messages 
end 

class Message 
    include Mongoid::Document 

    field :keywords, :type => Array 
end 

我試圖做類似的嵌入式模式消息:

u = User.last 
u.messages.where(:keywords => /sometext/).first 

但這沒有返回值時,如果該字段的類型不是Array而且是String,則正則表達式似乎可以正常工作。我怎麼能用Mongoid做這樣的事情?

我也應該提到這一點蒙戈查詢工作正常:

db.users.find({"messages.keywords" : /index/ }) 
+0

它看起來像你使用'mongoid'。這是一個包裝MongoDB rub​​y​​驅動程序的包裝器,並根據它認爲合適的方式輸出自己的查詢。你有什麼辦法來檢查'mongoid'實際上在運行什麼?你跑的是同一個嗎? – 2011-05-23 18:40:39

+0

所以我相信這實際上是一個Mongoid處理嵌入式模型的問題,如果我將消息模型拖入引用模型中,此查詢可以正常工作。 – trobrock 2011-05-23 19:25:42

回答

0

你直接蒙戈查詢發現,已經嵌入了指定匹配的子消息的用戶文檔。它看起來像你的Mongoid查詢的意圖是在已經返回的用戶文檔上找到匹配的消息。我不知道你要找的是什麼行爲,但如果你想執行Mongoid相同蒙戈直接查詢,這將是這個樣子:

users = User.where("messages.keywords" => /sometext/) 
+0

這個問題是我需要返回的消息記錄,而不是用戶記錄 – trobrock 2011-05-25 03:16:24

2

如果你正在處理一個陣列,你用「in」。

users = User.where("messages.keywords".in => [/sometext/]) 

應該工作,如果我沒有弄錯。

亞歷

User.where("messages.keywords".in => [/sometext/]).each do |user| 
    message_collection_for_user = user.messages.where("keywords".in => [/sometext/]) 
end 

現在,你有你的消息,並可以做,但你不能得到消息的集合爲它不工作方式的所有用戶。

+0

這也將返回用戶模型不是消息模型 – trobrock 2011-06-26 18:09:44

+0

這是正確的,但作爲您的模型消息嵌入模型內部根本沒有辦法用mongodb獲取直接消息,這不是嵌入式文檔的工作方式......請參閱編輯以獲取它。 – Alex 2011-06-26 19:24:37

+0

如果你真的想要所有用戶的消息集合,那麼你不需要在用戶中嵌入消息,而是引用它。 – Alex 2011-06-26 19:28:48