MongoDB:按存在的字段排序,然后按字母顺序排序

8
在我的数据库中,有一个名为name的字段。在一些记录中,它是一个空字符串,在其他记录中它有一个名字。
在我的查询中,我目前正在执行:
db.users.find({}).sort({'name': 1})

然而,这种方法首先返回空名称字段的结果,然后按字母顺序返回结果。如果做.sort({'name': -1}),会得到带有名称的结果,然后是一个空字符串的结果,但它们是按照相反的字母顺序排列的。

有没有一种优雅的方式来实现这种类型的排序?

2个回答

16

怎么样:

db.users.find({ "name": { "$exists": true } }).sort({'name': 1})

因为如果你想排序的字段实际上不存在,返回值将是null,因此比任何正数结果都要“低”,所以如果你真的只想寻找具有匹配值的内容,排除那些结果是有意义的。

如果你真的想要所有结果,无论是否存在null内容,那么我建议你通过.aggregate()对它们进行加权处理:

db.users.aggregate([
     { "$project": {
         "name": 1,
         "score": {
             "$cond": [
                 { "$ifNull": [ "$name", false ] },
                 1,
                 10
             ]
         }
     }},
     { "$sort": { "score": 1, "name": 1 } }
])

通过将一个值赋值为null,这会将所有null的结果都移到“链”的末尾。


最终,我决定回到我的数据库创建脚本中,并在每个文档创建时添加手动“评分”(使我对不同参数有更多控制),但这个解决方案也很有效。 - JVG

2

如果你想过滤掉空的"name"字段的文档,可以修改查询语句:db.users.find({"name": {"$ne": ""}}).sort({"name": 1})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接