在我的數據庫中,我有一個字段name
。在某些記錄中,它是一個空字符串,在其他記錄中有一個名稱。MongoDB:按字段存在然後按字母順序排序
我的查詢中,我正在做的:
db.users.find({}).sort({'name': 1})
然而,這首先返回一個空的名稱字段的結果,然後按字母順序返回結果。正如預期的那樣,做.sort({'name': -1})
返回帶有名稱的結果,然後用空字符串返回結果,但它是按字母順序顛倒的。
有沒有一種優雅的方式來實現這種類型的排序?
在我的數據庫中,我有一個字段name
。在某些記錄中,它是一個空字符串,在其他記錄中有一個名稱。MongoDB:按字段存在然後按字母順序排序
我的查詢中,我正在做的:
db.users.find({}).sort({'name': 1})
然而,這首先返回一個空的名稱字段的結果,然後按字母順序返回結果。正如預期的那樣,做.sort({'name': -1})
返回帶有名稱的結果,然後用空字符串返回結果,但它是按字母順序顛倒的。
有沒有一種優雅的方式來實現這種類型的排序?
如何:
db.users.find({ "name": { "$exists": true } }).sort({'name': 1})
因爲畢竟,當你要作爲排序依據是現場實際上不存在,那麼返回的值是null
,因此在順序上「低於」任何肯定的結果。因此,如果您只是在尋找具有匹配值的內容,就排除這些結果是有意義的。
如果你真的想在那裏和null
內容的regarless所有的結果,那麼我建議你「重量」他們通過.aggregate()
:
db.users.aggregate([
{ "$project": {
"name": 1,
"score": {
"$cond": [
{ "$ifNull": [ "$name", false ] },
1,
10
]
}
}},
{ "$sort": { "score": 1, "name": 1 } }
])
而這一切null
結果移動到「結束鏈「通過分配一個值。
如果您想篩選出文檔與空"name"
領域,改變你的查詢:db.users.find({"name": {"$ne": ""}}).sort({"name": 1})
最後,我決定回到我的數據庫創建腳本中,並在創建每個文檔時添加一個手動「評分」(讓我更好地控制不同的參數),但此解決方案也起作用。 – Jascination