2014-10-10 16 views
17

Giải pháp cho câu hỏi này có thể trông khá đơn giản, nhưng tôi đã vẫy tay với không có câu trả lời.Kiểm tra phạm vi Mongoid Nếu trường mảng có giá trị

Tôi đang sử dụng Mongoid trong số Đường ray 4.1.4 ứng dụng của mình. Tôi có một mô hình có chứa trường Array sẽ có giá trị Chuỗi.

Tôi cần một Mongoid củaphạm vi trong mô hình để lấy những trường hợp Mảng lĩnh vực này chứa một giá trị Chuỗi cụ thể, được đưa ra như một tham số để phạm vi. Hãy nói rằng chúng tôi có mô hình này:

class SomeModel 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :some_array, type: Array, default: Array.new 

    scope :some_scope, ->(value){ elem_match(some_array: value) } 

end 

Trên đây phạm vi không làm việc vì, rõ ràng, trong MongoDB$ elemMatch cần phải nhận được một Tiêu chuẩn như giá trị. Tuy nhiên, làm cách nào để tiêu chí Tiêu chí chỉ nói rằng phần tử phải bằng với giá trị đã cho ???.

Bất kỳ manh mối nào về cách viết phạm vi khá đơn giản này ???.

Kính trọng !!!. Cảm ơn trước.

Trả lời

25

Bạn đang làm những việc quá phức tạp. Nếu một trường chứa một mảng thì bạn có thể tìm kiếm nó như thể nó không phải là một mảng. Ví dụ, nếu bạn có điều này trong một tài liệu:

{ some_array: [ 'where', 'is', 'pancakes', 'house?' ] } 

và bạn làm một truy vấn như thế này:

where(:some_array => 'pancakes') 

bạn sẽ tìm thấy tài liệu đó. Bạn không cần $elemMatch hoặc bất kỳ điều gì phức tạp ở đây; bạn có thể giả vờ rằng mảng là một giá trị duy nhất cho các truy vấn đơn giản như bạn có:

scope :some_scope, ->(value) { where(:some_array => value) } 

Bạn chỉ cần để có được vào $elemMatch nếu bạn muốn áp dụng nhiều điều kiện để mỗi phần tử của mảng, mọi thứ như thế này từ $elemMatch tài liệu:

results: { $elemMatch: { $gte: 80, $lt: 85 } } 
// ^^^^^^^array   ^^^^^^^^^^^^^^^^^^^^^multiple conditions 

Đừng cảm thấy xấu, các tài liệu MongoDB hiện nay không chính xác rõ ràng về công cụ này (hoặc ít nhất là tôi không thể tìm thấy một lời giải thích rõ ràng).

+0

Đã không đến với suy nghĩ của tôi rằng nó có thể là đơn giản. Hãy để tôi thử và tôi sẽ cho bạn biết nếu nó thực sự làm việc cho tôi. Cảm ơn!. –

+0

Hoạt động hoàn hảo. Cảm ơn!. –

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