MongoDB:按现有字段排序,然后按字母顺序排序
在我的数据库中,我有一个名为MongoDB:按现有字段排序,然后按字母顺序排序,mongodb,Mongodb,在我的数据库中,我有一个名为的字段。在某些记录中,它是一个空字符串,在另一些记录中,它有一个名称 在我的查询中,我目前正在做: db.users.find({}).sort({'name': 1}) 但是,这将首先返回带有空名称字段的结果,然后按字母顺序返回结果。正如预期的那样,执行.sort({'name':-1})返回带有名称的结果,然后返回带有空字符串的结果,但其字母顺序相反 有没有一种优雅的方法可以实现这种排序?如果您想筛选出带有空“name”字段的文档,请更改您的查询:db.user
的字段。在某些记录中,它是一个空字符串,在另一些记录中,它有一个名称
在我的查询中,我目前正在做:
db.users.find({}).sort({'name': 1})
但是,这将首先返回带有空名称字段的结果,然后按字母顺序返回结果。正如预期的那样,执行.sort({'name':-1})
返回带有名称的结果,然后返回带有空字符串的结果,但其字母顺序相反
有没有一种优雅的方法可以实现这种排序?如果您想筛选出带有空“name”
字段的文档,请更改您的查询:db.users.find({“name”:{“$ne”:“}})。sort({“name”:1})
怎么样:
db.users.find({“name”:{“$exists”:true}).sort({'name':1})
因为毕竟,当您想要排序的字段实际上不存在时,返回值是null
,因此在顺序上比任何正结果都“低”。因此,如果您只是在寻找具有匹配值的内容,那么排除这些结果是有意义的
如果您确实希望所有结果都在那里,并且不包含null
内容,那么我建议您通过.aggregate()
对它们进行“加权”:
db.users.aggregate([
{“$project”:{
“名称”:1,
“分数”:{
“$cond”:[
{“$ifNull”:[“$name”,false]},
1.
10
]
}
}},
{“$sort”:{“score”:1,“name”:1}
])
通过分配一个值,将所有null
结果移动到“链的末端”。最后,我决定回到我的DB创建脚本中,在创建每个文档时添加一个手动“评分”(让我对不同的参数有更多的控制),但这个解决方案也起到了作用。