Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:按现有字段排序,然后按字母顺序排序_Mongodb - Fatal编程技术网

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创建脚本中,在创建每个文档时添加一个手动“评分”(让我对不同的参数有更多的控制),但这个解决方案也起到了作用。