2013-08-20 24 views
5

Tôi có một bộ sưu tập trong MongoDB với hai ngày xác định có hay không một cái gì đó là hiện tại. Vì vậy, tôi có một "end_date" có thể là null hoặc có thể có giá trị thời gian. Một mục hiện tại có thời gian trống hoặc một thời gian trong tương lai. Truy vấn của tôi trông giống như sau:MongoDB - tìm kết quả có giá trị bằng hoặc nhỏ hơn X

program_enrollments.find({"start_date":{"$lte":1376982000},"end_date":[null,{"$gte ":1376982000}],"client":"52002d02cc94a31a0f000000"}, []) 

Điều này có vẻ phù hợp với tôi, nhưng tôi có cần cách tiếp cận khác không? Tôi không muốn có một lá cờ boolean mà nói có hay không là ngày hiện tại nếu tôi có thể tránh nó.

Trả lời

9

Bạn đang tìm kiếm hoạt động $or, chấp nhận một loạt các hoạt động. Nó sẽ là như vậy:

$or: [{end_date: null}, {end_date: {$gte: 1376982000}}] 

toàn bộ truy vấn của bạn sẽ trông giống như:

program_enrollments.find({ 
    start_date: {$lte: 1376982000}, 
    $or: [ 
    {end_date: null}, 
    {end_date: {$gte: 1376982000}} 
    ], 
    client:"52002d02cc94a31a0f000000" 
}) 

Để mở rộng quy mô, bạn sẽ muốn tìm một cách để loại bỏ một trong hai nhà khai thác $gte$lte. MongoDB không thể sử dụng kết hợp các số $lte$gte trên các thuộc tính khác nhau trong truy vấn.

0

Thay vì {end_date: null} bạn có thể hỏi xem biến có tồn tại không bằng cách sử dụng {end_data: {$exists: false}}. Lưu ý rằng nếu end_date có trong tài liệu có giá trị null, thì giá trị đầu tiên sẽ hoạt động và giá trị thứ hai sẽ không hoạt động.

+1

'{end_date: null}' cũng bao gồm trường hợp góc mà trường đơn giản không hiện diện do thiếu sót, '{end_data: {$ exist: false}}' không ... ít nhất là không khi tôi thử nghiệm với v3.0 – pulkitsinghal

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