2015-08-08 79 views
2

我想通過將具有特定值的項目放在其他項目之前對其進行排序。按價值排序項目mongodb

例如,我希望所有"getthisfirst": "yes"的項目都在其他項目之前。

{"getthisfirst": "yes"} 
{"getthisfirst": "yes"} 
{"getthisfirst": "no"} 
{"getthisfirst": "maybe"} 

回答

5

此作爲一般概念被稱爲 「權重」。因此,如果沒有任何其他機制,則可以通過邏輯上將「權重」的值「投影」到文檔中,從而在邏輯上處理MongoDB查詢。

您的「投影」和改變領域本文檔中的方法是.aggregate()方法,特別是$project流水線階段:

db.collection.aggregate([ 
    { "$project": { 
     "getthisfirst": 1, 
     "weight": { 
      "$cond": [ 
       { "$eq": [ "$getthisfirst", "yes" ] }, 
       10, 
       { "$cond": [ 
        { "$eq": [ "$getthisfirst", "maybe" ] }, 
        5, 
        0 
       ]} 
      ] 
     } 
    }}, 
    { "$sort": { "weight": -1 } } 
]); 

這裏的$cond運營商是一個"ternary"(如果/那麼/其他)條件,其中第一個參數是到達布爾值true|false的條件表達式。如果true「then」則返回第二個參數作爲結果,否則返回「else」或第三個參數作爲響應。

在這個「嵌套」的情況下,那麼在「是」匹配的情況下,指定某個「權重」分數,否則我們繼續下一個條件測試,其中當「可能」是匹配時,則是anoter分數被分配,否則得分是0,因爲我們只有三個匹配的可能性。

然後應用$sort條件,以便「排序」(以降序排列)頂部具有最大「權重」的結果。