2015-09-20 342 views
2

在我的數據庫中,我有一個字段name。在某些記錄中,它是一個空字符串,在其他記錄中有一個名稱。MongoDB:按字段存在然後按字母順序排序

我的查詢中,我正在做的:

db.users.find({}).sort({'name': 1}) 

然而,這首先返回一個空的名稱字段的結果,然後按字母順序返回結果。正如預期的那樣,做.sort({'name': -1})返回帶有名稱的結果,然後用空字符串返回結果,但它是按字母順序顛倒的。

有沒有一種優雅的方式來實現這種類型的排序?

回答

4

如何:

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結果移動到「結束鏈「通過分配一個值。

+0

最後,我決定回到我的數據庫創建腳本中,並在創建每個文檔時添加一個手動「評分」(讓我更好地控制不同的參數),但此解決方案也起作用。 – Jascination

2

如果您想篩選出文檔與空"name"領域,改變你的查詢:db.users.find({"name": {"$ne": ""}}).sort({"name": 1})