2012-02-08 5 views
5

Thực sự không nhiều hơn để nói hơn những gì đã có trong câu hỏi.Có cách nào để đặt tất cả giá trị nil ở cuối khi sắp xếp với mongodb/mongoid?

sử dụng mongoid:

People.asc(:age) 

tôi nhận được giá trị nil đầu tiên.
có cách nào để luôn trả lại số không cuối cùng hoặc để nói mongodb coi nil là rất cao?

Chính xác như những gì được trả lời cho the same problem in sql here

Trả lời

1

Tôi chắc chắn câu trả lời là "không" cho MongoDB. Không có cách nào để cung cấp chức năng sắp xếp tùy chỉnh, bạn chỉ có thể cung cấp các khóa để sắp xếp. Có a request for custom sorting functions và họ thậm chí còn đề cập đến trường hợp của bạn đặc biệt sử dụng:

loại javascript helper cho phân loại tùy chỉnh/indexing
[...]
thể này được sử dụng để sắp xếp theo thứ tự abc trên một lĩnh vực, và đặt tài liệu với giá trị null ở cuối tập kết quả?
[...]
@nick - có

Vì vậy, bạn không đơn độc trong muốn đưa null s ở một đầu này hay cách khác.

Tôi nghĩ rằng tốt nhất bạn có thể làm ngay bây giờ là để làm điều đó trong Ruby, một cái gì đó như thế này:

nils, not_nils = People.asc(:age).partition { |p| p.age.nil? } 
people = not_nils + nils 

tôi không sử dụng Mongoid nhưng có lẽ asc mang đến cho bạn một Enumerable, nếu không thì có lẽ bạn có thể dán to_a vào đó. Tất nhiên loại hackery này là vô ích nếu bạn đang phân trang.

+0

Cảm ơn bạn đã liên kết đến tính năng được yêu cầu. Tôi sẽ làm theo. Mongoid sử dụng tiêu chí, vì vậy tôi sẽ cần một to_a trong đó. Nhưng tôi nghĩ rằng chúng tôi có thể làm mà không có những người nil sau khi tất cả. Và như bạn nói, phân trang sẽ làm cho điều này ít quan trọng hơn nhiều. –

+0

sau khi xem xét nó gần hơn, những gì được đề xuất có javascript phân loại dựa trên một chức năng. điều này có nghĩa là để sắp xếp bộ sưu tập được truy vấn, mongodb sẽ phải lặp lại toàn bộ bộ sưu tập, điều này chắc chắn không giải quyết được vấn đề. Điều tôi mong mongod đơn giản hơn nhiều: null cuối cùng, hoặc null trước. –

+0

@Stephane: sắp xếp yêu cầu cơ sở dữ liệu quay qua toàn bộ tập kết quả áp dụng một chú thích, vấn đề là MongoDB chỉ cho phép bạn sử dụng 'a> b' hoặc' a

2

Không nếu bạn muốn thứ tự tăng dần cho các lứa tuổi không nil. Nếu điều đó không quan trọng, bạn có thể xem nếu

People.desc(:age) 

sẽ đặt giá trị nil ở cuối. Ngoài ra, bạn có thể thử thêm tham số tìm kiếm để không trả lại giá trị nil:

People.not_in(age: [nil]).asc(:age)