在我的数据库中,我有一个字段name.在某些记录中,它是一个空字符串,在其他记录中,它有一个名称.
在我的查询中,我目前正在做:
db.users.find({}).sort({'name': 1})
Run Code Online (Sandbox Code Playgroud)
但是,这将首先返回带有空名称字段的结果,然后按字母顺序返回结果.正如预期的那样,.sort({'name': -1})使用名称返回结果,然后使用空字符串返回结果,但它按反向字母顺序排列.
有没有一种优雅的方式来实现这种类型的排序?
怎么样:
db.users.find({ "name": { "$exists": true } }).sort({'name': 1})
Run Code Online (Sandbox Code Playgroud)
因为毕竟当你想要排序的字段实际上不存在时,返回的值就是null因此顺序中的"低"而不是任何正结果.因此,如果您真的只是寻找具有匹配值的东西,那么排除这些结果是有意义的.
如果你真的想在那里得到所有的结果并且不知道null内容,那么我建议你通过.aggregate()以下方式" 权衡"它们:
db.users.aggregate([
{ "$project": {
"name": 1,
"score": {
"$cond": [
{ "$ifNull": [ "$name", false ] },
1,
10
]
}
}},
{ "$sort": { "score": 1, "name": 1 } }
])
Run Code Online (Sandbox Code Playgroud)
并且null通过分配值来将所有结果移动到"链的末端".
| 归档时间: |
|
| 查看次数: |
8574 次 |
| 最近记录: |