2016-09-07 195 views
1

我有,作爲一個硬編碼字符串傳遞以下查詢工作:貓鼬通嵌套排序對象查詢

router.get('/rank/:round/', (req, res, next) => { 

    let query = { "score.0.r1" : -1}; 

    Team.find({}) 
     .sort(query) 
     .then(teams => { 
      return res.json(teams); 
     }).catch(next); 
}); 

然而,當我嘗試在我的路線PARAM :round通過這樣的:

let query = { "score.0.r" + req.params.round : -1}; 

它不起作用(它返回一個未排序的列表)。

我也曾嘗試:

let sort = "score.0['r" + req.params.round + "']"; 
let query = { sort : -1 }; 

再次,沒有成功。這是我正在查詢的示例文檔:

{ 
    "_id" : ObjectId("57cc7665a43bf14533b0d78a"), 
    "name" : 「Joe Bloggs」, 
    "score" : [ 
     { 
      "r5" : 23, 
      "r4" : 20, 
      "r3" : 25, 
      "r2" : 23, 
      "r1" : 40 
     } 
    ] 
} 

...我試圖按r(圓)分數返回排序列表。

回答

1

我認爲這應該工作。

let sort = "score.0.r" + req.params.round 
let query = { [sort] : -1 }; 

它只是JavaScript中,通過JavaScript的默認對象的鍵轉換爲字符串

let query = { "score.0.r" + req.params.round : -1}; 
query; //{ String("score.0.r" + req.params.round) : -1} 
     //{ '"score.0.r" + req.params.round': -1} 

let sort = "score.0['r" + req.params.round + "']"; 
let query = { sort : -1 }; 
query; // { String(sort) : -1} => {"sort": -1} 

做以JavaScript對象動態密鑰,只附上與支架

var string = "any_string" + variable 
var obj = { [string] : "anyvalue"} 
//this will tell javascript that the key is variable not a string 
+0

天才的關鍵!謝謝,我永遠不會想到這一點。如果你想提供一個簡短的解釋,我相信這對其他人也是非常有用的。 :-) –