Есть ли способ поставить все значение nil в конце при сортировке с помощью mongodb / mongoid? - PullRequest
6 голосов
/ 09 февраля 2012

На самом деле сказать гораздо больше, чем то, что уже есть в вопросе.

с использованием mongoid:

People.asc(:age)

Сначала я получаю значение nil.
есть ли способ всегда возвращать nil last , или сказать mongodb, что нужно лечить nilкак очень высокий?

Точно так же, как ответ на та же проблема в sql здесь

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Нет, если вы хотите, чтобы возрастания не возрастали.Если это неважно, вы можете увидеть, если

People.desc(:age)

поставит нулевые значения в конце.Кроме того, вы можете попробовать добавить параметр поиска, чтобы не возвращать значения nil:

People.not_in(age: [nil]).asc(:age)
2 голосов
/ 09 февраля 2012

Я почти уверен, что ответ "нет" для MongoDB.Там нет никакого способа предоставить пользовательскую функцию сортировки, вы можете только предоставить ключи для сортировки.Существует запрос пользовательских функций сортировки , и в них даже упоминается ваш конкретный случай использования:

помощник по сортировке javascript для пользовательской сортировки / индексации
[...]
Может ли это использоваться для сортировки по полю в алфавитном порядке и помещения документов с нулевым значением в конец набора результатов?
[...]
@nick - да

Так что вы не одиноки в желании поставить null s на одном конце или другом.

Я думаю, что лучшее, что вы можете сделать сейчас, это сделать это в Ruby,что-то вроде этого:

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

Я не использую Mongoid, но, предположительно, asc дает вам Enumerable, если нет, то, возможно, вы могли бы вставить туда to_a.Конечно, этот вид хакерства бесполезен, если вы разбиваете на страницы.

...