2
我想通過將具有特定值的項目放在其他項目之前對其進行排序。按價值排序項目mongodb
例如,我希望所有"getthisfirst": "yes"
的項目都在其他項目之前。
{"getthisfirst": "yes"}
{"getthisfirst": "yes"}
{"getthisfirst": "no"}
{"getthisfirst": "maybe"}
我想通過將具有特定值的項目放在其他項目之前對其進行排序。按價值排序項目mongodb
例如,我希望所有"getthisfirst": "yes"
的項目都在其他項目之前。
{"getthisfirst": "yes"}
{"getthisfirst": "yes"}
{"getthisfirst": "no"}
{"getthisfirst": "maybe"}
此作爲一般概念被稱爲 「權重」。因此,如果沒有任何其他機制,則可以通過邏輯上將「權重」的值「投影」到文檔中,從而在邏輯上處理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
條件,以便「排序」(以降序排列)頂部具有最大「權重」的結果。