【问题标题】:Mongoose pass nested sort object to queryMongoose 将嵌套排序对象传递给查询
【发布时间】:2017-01-15 15:05:59
【问题描述】:

我有以下查询,作为硬编码字符串传递:

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 );
} );

但是,当我尝试像这样传递我的路由参数 :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(圆形)分数返回排序列表。

【问题讨论】:

    标签: arrays node.js mongodb sorting mongoose


    【解决方案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
    

    【讨论】:

    • 天才!谢谢你,我永远不会想到这一点。如果您想对此提供简短的解释,我相信它对其他人也非常有用。 :-)
    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 2020-10-04
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2019-04-06
    相关资源
    最近更新 更多