我想按升序对某个键上的MongoDB集合进行排序,并且需要没有该键的记录。 e.g。
db.coll.find({}, {key: 1}).sort({key: 1})
给出:
{_id: 1}
{_id: 2, key: 1}
{_id: 3, key: 2}
但应该提供以下内容:
{_id: 2, key: 1}
{_id: 3, key: 2}
{_id: 1}
有没有办法用MongoDB做到这一点?
答案 0 :(得分:3)
这是不可能的。创建文档时,必须将“key”设置为理论上的最大值。或者,您可以执行两个查询(一个用于获取“key”存在的所有排序,以及一个没有设置“key”的可选其他查询,以便在需要时补充结果集)。由于各种业务规则限制,通常后者是不可能的。
答案 1 :(得分:3)
不幸的是mongoDB“在比较不同BSON类型的值时,MongoDB使用以下比较顺序,从最低到最高:”DOCS
当mongo生成索引时,对于那些没有获得密钥的文档,它将包含null。 您可以使用两个查询来完成,第一个使用备用索引。
如果在关键字段上定义备用索引,则排序将仅返回具有值的索引。这个将排除没有密钥的文档。 DOCS
答案 2 :(得分:1)
这可以使用聚合框架来完成,但这会非常痛苦。您必须使用高于有效密钥的标记值替换丢失的密钥(通过使用在您拥有的密钥类型之后排序的类型的密钥很容易,除非密钥是正则表达式),然后对集合进行排序,然后去除标记值。
使用$exist
在两个常规查询中执行此操作会更有效。
答案 3 :(得分:0)
我有一个类似的问题: 我需要按其中包含数字的文本进行排序,并且数字应在字符串之后显示。 我们现在看到的唯一方法是创建一个索引字段,在该字段中,数字被字符替换,以便将它们排在字符串之后。