2012-10-21 64 views
33

這個問題一定要問很多,但它的記錄很差。有一個在http://mongoid.org/en/mongoid/docs/querying.htmlMongoid OR查詢語法

沒有提到我試圖檢查用戶是否存在(下面是AND查詢),我怎樣才能將其更改爲OR類型的查詢

Username.where(:username=>@username, :email=>@email) 

(無論是電子郵件或用戶名必須匹配)。

我已經發現了一些相當複雜的方式包括網上發送的直接的JavaScript(從):http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

當然必須有一個簡單清晰的語法正確地做到這一點?

回答

35

是的,這用於記錄更好。試試這個:

Username.any_of({:username => @username}, 
       {:email => @email}) 
101

對於其他人誰這個網頁上結束了的緣故,更新的語法現在是

Username.or({username: @username}, {email: @email}) 

請參閱updated docs

+10

在範圍中,您仍然必須使用'any_of',否則會引發語法錯誤。 – aledalgrande

+1

發佈的鏈接不會告訴任何關於'.or'和'any_of'的信息,請參考[here](https://github.com/mongodb/mongoid/blob/master/lib/mongoid/criteria/queryable/selectable)。 rb)來查看詳細的文檔和實現 – silva96

+0

你也可以在作用域中使用self.or(因爲'或'是ruby中的關鍵字) – Shiyason

1

在Mongoid 5.0,這對我的作品

Username.or({username: @username}.or({email: @email}) 
2

有一個在@米格爾-的Savignano的迴應錯字。根據Stackoverflow的「編輯隊列已滿」,這就是爲什麼我沒有提交編輯。

正確的語法:

Username.or({username: @username}).or({email: @email}) 

一個更簡潔的解決方案:

Username.or({username: @username}, {email: @email}) 

蒙戈選擇將解析:

{"$or"=>[{"username"=>@username}, {"email"=>@email}]} 

我發現這個問題,因爲我是試圖解決創造「或「查詢。

如果你想要匹配一個字符串或元素數組中的任何一個,那麼你將需要用Mongo'$ in'選擇器編寫一個Mongoid查詢。

例如,您有一個特定的用戶名和一組電子郵件。您希望返回所有結果,其中至少有一個字段與數組中的用戶名或電子郵件中的一個匹配。

@username = "jess" 
@emails = ["[email protected]", "[email protected]", "[email protected]"] 
User.or({username: ""}, {email: {'$in': @emails}}) 

蒙戈選擇將解析:

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]} 
  • 如果你有Users與數據庫中的3封電子郵件的2,然後選擇將返回2.
  • 計數如果你有一個Userusername「jess」和另外3個Users,每個都有一個給定的電子郵件,那麼選擇器將返回一個4的計數。
3

此外,在Mongoid 5.0,如果你仍然想使用where方法,使用下面的

Username.where('$or' => [ { username: @username }, { email: @email } ]) 

這個當你構建一種查詢哈希以動態的方式是非常有用的,您需要保留where方法