【问题标题】:Moongoose sort by parseFloat(String)?Mongoose 通过 parseFloat(String) 排序?
【发布时间】:2019-10-06 00:01:03
【问题描述】:

我想按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);
            }
        });

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

【问题讨论】:

    标签: node.js mongodb sorting mongoose


    【解决方案1】:

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

    它只接受列名和顺序。

    实现目标的途径有两条:

    1. 在mongo中使用mapreduce,先转换类型,然后排序
    2. 从数据库中检索所有数据,并在您的 node.js 程序中对其进行排序。

    但两者都很糟糕和丑陋

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

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

    【讨论】:

      【解决方案2】:

      排序查询后的用户排序,它将正确地按升序和降序对字符串浮点数进行排序。

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

      【讨论】:

        猜你喜欢
        • 2012-07-27
        • 2019-01-08
        • 2013-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        相关资源
        最近更新 更多