有没有办法在使用mongodb / mongoid排序时将所有nil值放在最后?

时间:2012-02-08 21:45:40

标签: ruby mongodb mongoid

真的没什么可说的,而不是问题中的内容。

使用mongoid:

People.asc(:age)

我先得到零值 有没有办法总是返回nil last ,或者告诉mongodb将nil视为非常高?

the same problem in sql here

的答案完全一样

2 个答案:

答案 0 :(得分:3)

如果您想要非零年龄的升序,则不会。如果这不重要,你可以看看是否

People.desc(:age)

将nil值放在最后。或者,您可以尝试添加搜索参数以不返回nil值:

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

答案 1 :(得分:2)

我很确定MongoDB的答案是“不”。无法提供自定义排序功能,您只能提供要排序的键。有a request for custom sorting functions,他们甚至提到了您的特定用例:

  

用于自定义排序/索引的javascript排序助手
  [...]
  这可以用于在字段上按字母顺序排序,并在结果集的末尾放置一个空值的文档吗?   [...]
  @nick - 是的

所以你并不是唯一一个想把null放在一端或另一端的人。

我认为你现在能做的最好的事情就是用Ruby做这件事:

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

我不使用Mongoid但是假设asc给你一个Enumerable,如果没有,那么也许你可以在那里粘贴一个to_a。当然,如果你是分页的话,这种hackery是无用的。