2012-10-21 28 views
33

Điều này phải được yêu cầu rất nhiều nhưng nó rất kém tài liệu. Không có đề cập đến tại http://mongoid.org/en/mongoid/docs/querying.htmlMongoid OR cú pháp truy vấn

Tôi đang cố gắng để kiểm tra xem một người dùng tồn tại (dưới đây là một VÀ query), làm thế nào tôi có thể thay đổi nó thành một truy vấn OR loại

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

(Hoặc email hoặc tên người dùng phải khớp).

Tôi đã tìm thấy một số cách khá phức tạp trực tuyến bao gồm gửi một javascript trực tiếp (từ): http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

Chắc chắn phải có một cú pháp đơn giản rõ ràng để làm điều này một cách chính xác?

Trả lời

35

Vâng, điều này thường được ghi nhận tài liệu tốt hơn. Hãy thử điều này:

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

Vì lợi ích của những người khác kết thúc trên trang này, cú pháp cập nhật tại là

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

Vui lòng tham khảo updated docs.

+10

Trong phạm vi bạn vẫn phải sử dụng 'any_of' nếu không nó sẽ ném một lỗi cú pháp. – aledalgrande

+1

Liên kết được đăng không nói bất cứ điều gì về '.or' cũng không' any_of', vui lòng tham khảo [tại đây] (https://github.com/mongodb/mongoid/blob/master/lib/mongoid/criteria/queryable/selectable. rb) để xem tài liệu chi tiết và thực hiện – silva96

+0

bạn cũng có thể sử dụng self.or trong phạm vi (vì 'hoặc' là từ khóa trong ruby) – Shiyason

1

Trong Mongoid 5.0, điều này làm việc cho tôi

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

Có một lỗi đánh máy để đáp ứng @ miguel-savignano của. Theo Stackoverflow, "hàng đợi chỉnh sửa đã đầy", đó là lý do tôi không gửi chỉnh sửa.

đúng cú pháp:

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

Một giải pháp ngắn gọn hơn:

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

Bộ chọn Mongo sẽ quyết tâm:

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

Tôi tìm thấy câu hỏi này như tôi đã cố gắng giải quyết việc tạo ra " hoặc "truy vấn.

Nếu bạn đang tìm kiếm để phù hợp với một chuỗi hoặc bất kỳ một trong một mảng các yếu tố, sau đó bạn sẽ cần phải viết một truy vấn Mongoid với bộ chọn Mongo '$ in'.

Ví dụ: bạn có tên người dùng cụ thể và một mảng email. Bạn muốn trả lại tất cả các kết quả trong đó ít nhất một trong các trường khớp với tên người dùng hoặc một trong các email trong mảng.

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

Bộ chọn Mongo sẽ quyết tâm:

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]} 
  • Nếu bạn có Users với 2 trong 3 email trong cơ sở dữ liệu của bạn, sau đó chọn sẽ trả về một tội danh 2.
  • Nếu bạn có một số User với số username "jess" và 3 số Users bổ sung với một trong số các email đã cho, thì bộ chọn sẽ trả về tổng số là 4.
3

Ngoài ra, trong Mongoid 5.0, nếu bạn vẫn muốn sử dụng phương pháp where, sử dụng sau đây

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

này rất hữu ích khi bạn đang xây dựng một loại băm truy vấn một cách năng động và bạn cần phải giữ phương thức where

Các vấn đề liên quan