2012-02-08 9 views

Respuesta

1

Estoy bastante seguro de que la respuesta es "no" para MongoDB. No hay forma de proporcionar una función de clasificación personalizada, solo puede proporcionar las claves para ordenar. Hay a request for custom sorting functions e incluso mencionó su caso en particular: Ayudante

Javascript especie para la clasificación de encargo/indexación
[...]
Podría esto ser usado para ordenar alfabéticamente en un campo, y poner documentos con un valor nulo al final del conjunto de resultados?
[...]
@ Nick - sí

Así que usted no está solo en su deseo de poner null s en un extremo o el otro.

Creo que lo mejor que puede hacer en este momento es hacerlo en Ruby, algo como esto:

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

No consumo Mongoid pero se supone que asc le da una Enumerable, si no, entonces tal vez podría pegar un to_a allí. Por supuesto, este tipo de piratería es inútil si estás paginating.

+0

Gracias por el enlace a la función solicitada. Seguiré esto. Mongoid usa criterios, por lo que necesitaré un to_a allí. Pero creo que podemos prescindir de los nulos después de todo. Y como dices, la búsqueda hará que esto sea mucho menos importante. –

+0

después de mirarlo más de cerca, lo que se propone es la clasificación de Javascript basada en una función. esto significaría que para ordenar la colección consultada, mongodb tendrá que iterar sobre toda la colección, lo que ciertamente no resuelve el problema. Lo que deseo que tenga mongodb es mucho más simple: nulo en último lugar, o nulo primero. –

+0

@Stephane: la ordenación requiere que la base de datos gire a través de todo el conjunto de resultados aplicando una acción de todos modos, el problema es que MongoDB solo le permite usar 'a> b' o' a

2

No, si usted quiere orden de las edades no nulos ascendente. Si eso no es importante, puede ver si

People.desc(:age) 

pondrá los valores nulos al final. Como alternativa, puede intentar añadir un parámetro de búsqueda de no volver a cero los valores:

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