首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB中的自定义排序

MongoDB中的自定义排序
EN

Stack Overflow用户
提问于 2013-05-29 14:24:30
回答 4查看 184关注 0票数 3

我希望在MongoDB集合上以升序对某个键进行排序,并需要没有键的记录排在最后。例如:

代码语言:javascript
运行
复制
db.coll.find({}, {key: 1}).sort({key: 1})

提供:

代码语言:javascript
运行
复制
{_id: 1}
{_id: 2, key: 1}
{_id: 3, key: 2}

但应该给出以下内容:

代码语言:javascript
运行
复制
{_id: 2, key: 1}
{_id: 3, key: 2}
{_id: 1}

有没有办法用MongoDB做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-29 19:36:17

不幸的是,mongoDB“在比较不同BSON类型的值时,MongoDB使用从最低到最高的以下比较顺序:”DOCS

  1. MinKey (内部类型)
  2. Null
  3. Numbers (整型,长整型,双精度型)
  4. 符号,String
  5. 对象
  6. 数组
  7. BinData
  8. ObjectID
  9. 日期,Timestamp
  10. 常规表达式code
  11. G226(内部类型)

当mongo生成索引时,对于那些没有获得密钥的文档,它将包含一个null。您可以使用两个查询来完成此操作,并对第一个查询使用备用索引。

如果在键字段上定义了一个空闲索引,排序将只返回那些有值的索引。这将排除没有关键字的文档。DOCS

票数 3
EN

Stack Overflow用户

发布于 2013-05-29 17:06:25

这是不可能的。在创建文档时,您必须将"key“设置为理论上的最大值。或者,您可以执行两个查询(一个是对所有"key“存在的地方进行排序,另一个是可选的,根本不设置"key”以补充您的结果集(如果需要的话))。由于各种业务规则的限制,后者通常是不可能的。

票数 3
EN

Stack Overflow用户

发布于 2013-05-30 13:17:48

这可能可以使用聚合框架来完成,但这将是相当痛苦的。您必须将缺少的键替换为高于有效键的标记值(使用按您拥有的键的类型排序的键很容易,除非键是正则表达式),然后对集合进行排序,然后剥离标记值。

使用$exist在两个常规查询中执行此操作效率会更高。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16806867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档