通过parseFloat(String)进行Mongoose排序

时间:2015-04-10 04:31:21

标签: node.js mongodb sorting mongoose

我希望Float value对查询结果进行排序。但是存储在mongodb中的值是String类型,我可以将String解析为Float并对其进行动态排序吗?就像复杂的排序一样。

以下是我的架构和排序代码的一部分:

架构:

var ScenicSpotSchema = new Schema({
    ...
    detail_info: {
        ...
        overall_rating: String,
        ...
    },
});

排序功能:

    ScenicSpot.find({'name': new RegExp(req.query.keyword)}, )
        .sort('-detail_info.overall_rating')
        .skip(pageSize * pageNumber)
        .limit(pageSize)
        .exec(function (err, scenicSpots) {
            if (err) {
                callback(err);
            } else {
                callback(null, scenicSpots);
            }
        });

感谢任何形式的帮助和建议。 :)

2 个答案:

答案 0 :(得分:0)

.sort mongoose不支持转换数据类型。见:http://mongoosejs.com/docs/api.html#query_Query-sort

它只接受列名和订单。

实现目标有两条途径:

  1. 在mongo中使用mapreduce,首先转换类型,然后使用sort
  2. 从数据库中检索所有数据,并在node.js程序中对其进行排序。
  3. 但两者都是可怕而丑陋的

    如果您想对String列进行排序,但将其解析为Float。此操作将扫描该集合中的所有数据,并且不能使用索引。这是非常缓慢的行动。

    所以我认为最快和最正确的操作是在你的mongodb数据库中将String列转换为Float。然后你可以使用普通.sort('-detail_info.overall_rating')来完成任务。

答案 1 :(得分:0)

排序后的用户排序规则将正确地对字符串浮点数进行升序和降序排序。

  cenicSpot.find({'name': new RegExp(req.query.keyword)}, )
    .sort('-detail_info.overall_rating')
    .collation({ locale: "en-US", numericOrdering: true })
    .skip(pageSize * pageNumber)
    .limit(pageSize)
    .exec(function (err, scenicSpots) {
        if (err) {
            callback(err);
        } else {
            callback(null, scenicSpots);
        }
    });