2010-01-05 59 views
35

Vì vậy, tôi có tài liệu được nhúng theo dõi thành viên nhóm. Mỗi tài liệu được nhúng có ID trỏ đến nhóm trong bộ sưu tập khác, ngày bắt đầu và ngày hết hạn tùy chọn.Truy vấn MongoDB có điều kiện 'hoặc'

Tôi muốn truy vấn các thành viên hiện tại của một nhóm. "Hiện tại" có nghĩa là thời gian bắt đầu nhỏ hơn thời gian hiện tại và thời gian hết hạn lớn hơn thời gian hiện tại HOẶC không có giá trị.

Truy vấn có điều kiện này hoàn toàn chặn tôi. Tôi có thể làm điều đó bằng cách chạy hai truy vấn và kết hợp các kết quả, nhưng điều đó có vẻ xấu xí và yêu cầu tải trong tất cả các kết quả cùng một lúc. Hoặc tôi có thể mặc định thời gian hết hạn cho một số ngày tùy ý trong tương lai xa, nhưng điều đó có vẻ xấu hơn và có khả năng giòn. Trong SQL tôi chỉ cần thể hiện nó với "(hết hạn> = Bây giờ()) HOẶC (hết hạn IS NULL)" - nhưng tôi không biết làm thế nào để làm điều đó trong Mongo.

Bất kỳ ý tưởng nào? Cảm ơn rất nhiều trước.

+0

câu hỏi Tương tự: http://stackoverflow.com/questions/1945577/logic-hoặc-cho-hai-lĩnh vực khác nhau-trong-nơi-truy vấn-in-mongodb –

Trả lời

66

Chỉ nghĩ rằng tôi muốn cập nhật trong trường hợp bất cứ ai tình cờ trên trang này trong tương lai. Tính đến 1.5.3, Mongo bây giờ hỗ trợ một $ thật hay điều hành: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

truy vấn của bạn về "(hết hạn> = Now()) OR (hết hạn IS NULL)" bây giờ có thể được trả lại như:

{$or: [{expires: {$gte: new Date()}}, {expires: null}]} 
2

Query objects in Mongo by default AND expressions together. Mongo currently does not include an OR operator for such queries, however there are ways to express such queries.

Sử dụng "in" hoặc "where".

của nó sẽ là một cái gì đó như thế này:

db.mycollection.find({ $where : function() { 
return (this.startTime < Now() && this.expireTime > Now() || this.expireTime == null); } }); 
+0

Khá mát mẻ, lần đầu tiên tôi thấy một chức năng được sử dụng với Mongo !! Nhược điểm của khóa học, tôi cho rằng, là nó sẽ không sử dụng các chỉ mục – Nico

1

Sử dụng $ nơi truy vấn sẽ được làm chậm, một phần vì nó không thể sử dụng các chỉ số. Đối với loại vấn đề này, tôi nghĩ sẽ tốt hơn nếu lưu trữ một giá trị cao cho trường "hết hạn" sẽ tự nhiên luôn lớn hơn Now(). Bạn có thể lưu trữ một ngày rất cao hàng triệu năm trong tương lai, hoặc sử dụng một loại riêng biệt để chỉ ra không bao giờ. Thứ tự sắp xếp loại chéo được xác định tại http://www.mongodb.org/display/DOCS/Compare+Order+for+Types. Regex hoặc MaxKey trống (nếu bạn hỗ trợ ngôn ngữ) là cả hai lựa chọn tốt.

33

Trong trường hợp bất kỳ ai tìm thấy nó hữu ích, www.querymongo.com thực hiện dịch giữa SQL và MongoDB, bao gồm cả mệnh đề HOẶC. Nó có thể thực sự hữu ích cho việc tìm ra cú pháp khi bạn biết tương đương SQL.

Trong trường hợp câu lệnh OR, nó trông như thế này

SQL:

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string'; 

MongoDB:

db.collection.find({ 
    "$or": [{ 
     "columnA": 3 
    }, { 
     "columnB": "string" 
    }] 
}); 
Các vấn đề liên quan