2010-10-04 27 views
5

Tôi cần viết một truy vấn MongoDB có dạng "A OR B OR (C AND D)" để trả về một số bản ghi. Chúng tôi đang sử dụng Mongoid để truy cập dữ liệu vào các mô hình của chúng tôi.Làm thế nào để bạn viết các truy vấn "(A HOẶC B) VÀ (A HOẶC C)" với Mongoid?

Tôi mở rộng truy vấn đó thành "(A HOẶC B HOẶC C) VÀ (A HOẶC B HOẶC D)" và hy vọng sử dụng phương pháp Tiêu chí của Mongoid any_of như sau: Model.any_of(A, B, C).any_of(A, B, D) sẽ thực hiện những gì tôi muốn, nhưng được mở rộng "A HOẶC B HOẶC C HOẶC A HOẶC B HOẶC D" trước khi được gửi đến cơ sở dữ liệu.

Có cách nào để xây dựng truy vấn này không hay tôi phải xây dựng một truy vấn để thực hiện A OR B và một truy vấn khác để thực hiện C VÀ D và lấy liên minh của chúng?

Trả lời

0

Kiểm tra liên kết này, hy vọng nó có thể giúp bạn -

http://mongoid.org/docs/querying/

Có lẽ nếu có thể, bạn có thể kết hợp ".any_in" và ".và" và kiểm tra.

0

Dường như đây là lỗi trong mongo, nhưng tôi đang gặp khó khăn trong việc tìm ra các vấn đề mongo được báo cáo/theo dõi.

> db.things.insert({x : 1, y: 2}); 
> db.things.insert({x : 2, y: 3}); 
> db.things.insert({x : 3, y: 4}); 
> db.things.find({ $or : [{x:1,x:2}], $or : [{y:1,y:2}] }); 
{ ..., "x" : 1, "y" : 2 } 
{ ..., "x" : 2, "y" : 3 } 
+1

Nhiều 'báo cáo $ or' không có ý nghĩa gì cả. Hãy suy nghĩ về những gì sẽ được khi chuyển đổi sang một đối tượng BSON. Sau này sẽ ghi đè lên trước đây. Ngoài ra, các tài liệu chọn của bạn cũng có lỗi tương tự; về cơ bản bạn đang tìm kiếm '$ hoặc: [{y: 2}]' ở đó. –

+0

Nhiều câu lệnh '$ hoặc' có ý nghĩa hoàn hảo, chỉ là chúng dường như không được hỗ trợ bởi mongo (có liên kết để xác minh điều này, btw?). Có vẻ như cách thực hành tốt nhất là chuyển đổi thủ công các liên kết của biểu mẫu '(A OR B) AND (A OR C) 'thành các liên kết như' A OR (B AND C) 'để sử dụng' $ hoặc', vì mongoid sẽ không làm điều này cho chúng tôi. –

+0

Nó có ý nghĩa trong ý nghĩa logic boolean, nhưng không phải trong ý nghĩa đối tượng JSON, mà không cho phép các khóa trùng lặp. Bạn đúng trong đó DNF là cách chính xác để thể hiện truy vấn. –

3

(Chỉnh sửa: Tôi chỉ nhận thấy câu hỏi này là 3 tuổi, tôi không có ý tưởng tại sao nó chỉ xuất hiện..)

Bạn muốn một cái gì đó như thế này:

Model.any_of(a, b, c) 

đâu a , bc là các tài liệu chọn (trong đó, hãy nhớ, được VÀO với nhiều mệnh đề).

Ví dụ, nếu truy vấn của bạn là:

{a: 1} 
{b: 1} 
{c: 1, d: 1} 

Sau đó, bạn sẽ sử dụng:

Model.any_of({a: 1}, {b: 1}, {c: 1, d: 1}) 

Điều này sẽ tạo ra một truy vấn như:

models.find({$or: [{a: 1}, {b: 1}, {c: 1, d: 1}]}) 
+0

Tôi đã bắt đầu một tiền thưởng cho câu hỏi này bởi vì đó là một câu hỏi hay mà không có bất kỳ câu trả lời hay nào. – Andrew

+0

Aha, hiểu rồi. Vâng, tôi hy vọng tôi là thỏa đáng. :) –

+0

Làm thế nào để 'any_of' cung cấp cho bạn' (A OR B) AND (A OR C) 'ở đây? –

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