使用Mongo DB中的数字对降序字符串进行排序

时间:2015-09-17 01:45:17

标签: node.js mongodb sorting mongoose database

我目前有一个有两个字段的数据库。其中只有一个对于这个问题的目的很重要。

想象一个带有单个字符串字段的数据库(让我们称之为"标记"),以及以下模式:[a-z]*[0-9]*,如:

  • test129
  • test130
  • some43
  • some44
  • some45
  • ...

我的应用程序需要生成新的"标签",给定前缀"标识符" (例如testsome)。

因此,我要说我输入test作为前置名称,100作为"标记"的数量。生成。

  • 他找到了带有前缀名test的LAST代码。
  • 解析前缀名称后面的数字。
  • 对该数字求和+1,并生成100个带序列的标签。

此特定情况下的输出为:test131test132,...,test230

我实现了这一点,它与Mongoose的效果非常好。但是,当我试图生成一个" Tag"从一个已存在的超过1000的标签,我发现第一步是一个缺陷。它正在返回,让我们说test999而不是test1200,并导致迭代从999开始,并因为它需要是唯一的而得到错误。

这是因为,排序字符串不同于排序数字。我知道这个问题,但是如何以简单的方式解决这个问题,而不必创建额外的字段?

更新:我找到代码的部分代码:

   lastAliasNumber: function (next){
        console.log('process.lastAliasNumber');

        // Skip if prefix is not set (tags already have name)
        if(!prefix) return next();

        // Build RegExp to find tags with the prefix given
        var regexp = new RegExp('^'+prefix+'[0-9]+$', 'i');

        Models.Tag
            .findOne()
            .where({
                alias: regexp
            })
            .sort('-alias')
            .exec(function (err, tag){
                if(err) return next(err);

                // Remove prefix and try parsing number
                var lastId = 100;

                if(tag){
                    // Remove prefix
                    var number = tag.alias.toLowerCase().replace(prefix, '');

                    // Get number from it
                    number = parseInt(number);
                    if(number) lastId = number;
                }
                console.log('lastAliasNumber', lastId);
                next(null, lastId);
            });
    },

1 个答案:

答案 0 :(得分:0)

在MongoDB中没有现成的方法可以进行这种排序。由于您的字段是字符串字段,它将按字符串排序规则排序,并且无法在一个字段上进行变量类型排序。

你最好的选择(假设你不能简单地使用一个整数类型并希望只保留一个字段)将计算出理论上的最大条目数,并相应地使用0的相应前导数字填充你的字符串。

EG。假设您的字符串最多为1,000,000个条目:

In [8]: df.pivot_table(index=['Published','Station'],columns=['TypeFuel'],values='Price').reset_index()
Out[8]:
TypeFuel  Published          Station  Diesel    Gas    ULP
0         1/09/2015  7-Eleven Malaga   155.9    NaN  135.9
1         1/09/2015       BP Seaford   133.9  156.9  129.9
2         1/09/2015   Shell Newhaven   150.9    NaN  139.9
3         2/10/2015       BP Seaford   133.6  157.9  138.9

另一种选择是让这些条目成为具有两种不同数据类型的整个子文档。

考虑下面的快速示例文档

test000999
test001200
test000131