Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Mongo DB中使用数字对降序字符串进行排序_Node.js_Mongodb_Sorting_Mongoose_Database - Fatal编程技术网

Node.js 在Mongo DB中使用数字对降序字符串进行排序

Node.js 在Mongo DB中使用数字对降序字符串进行排序,node.js,mongodb,sorting,mongoose,database,Node.js,Mongodb,Sorting,Mongoose,Database,我目前有一个带有两个字段的DB。就这一问题而言,其中只有一项是重要的 假设一个DB有一个字符串字段(我们称之为“标记”),并且有以下模式:[a-z]*[0-9]*,比如: 测试129 测试130 大约43 大约44 大约45 我的应用程序需要生成新的“标记”,给定前缀“标识符”(如test或some) 假设我输入test作为前置名,输入100作为要生成的“标记”的数量 他找到最后一个标签,上面有前缀名test 解析前缀名称后的数字 对该数字求和+1,并使用该序列生成100个标记 在这种

我目前有一个带有两个字段的DB。就这一问题而言,其中只有一项是重要的

假设一个DB有一个字符串字段(我们称之为“标记”),并且有以下模式:
[a-z]*[0-9]*
,比如:

  • 测试129
  • 测试130
  • 大约43
  • 大约44
  • 大约45
我的应用程序需要生成新的“标记”,给定前缀“标识符”(如
test
some

假设我输入
test
作为前置名,输入
100
作为要生成的“标记”的数量

  • 他找到最后一个标签,上面有前缀名
    test
  • 解析前缀名称后的数字
  • 对该数字求和+1,并使用该序列生成100个标记
在这种特定情况下,输出将是:
test131
test132
,…,
test230

我实现了这个,它与
Mongoose
配合得非常好。然而,当我试图从一个已经存在的超过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);
            });
    },

在MongoDB中没有现成的方法来进行这种排序。由于您的字段是字符串字段,因此将按照字符串排序规则对其进行排序,并且无法对一个字段执行变量类型排序

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

例如,假设最多有1000000个条目,您的字符串将是:

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

考虑我下面的快速示例文档

> db.bar.insert({x:{text:"test",num:1}})
WriteResult({ "nInserted" : 1 })
> db.bar.insert({x:{text:"test",num:100}})
WriteResult({ "nInserted" : 1 })
> db.bar.insert({x:{text:"test",num:2}})
WriteResult({ "nInserted" : 1 })
> db.bar.insert({x:{text:"sweet",num:2}})
WriteResult({ "nInserted" : 1 })
> db.bar.insert({x:{text:"sweet",num:1}})
WriteResult({ "nInserted" : 1 })
> db.bar.find().sort({x:1})
{ "_id" : ObjectId("55fa469d695632545d3aff1f"), "x" : { "text" : "sweet", "num" : 1 } }
{ "_id" : ObjectId("55fa469b695632545d3aff1e"), "x" : { "text" : "sweet", "num" : 2 } }
{ "_id" : ObjectId("55fa468a695632545d3aff1b"), "x" : { "text" : "test", "num" : 1 } }
{ "_id" : ObjectId("55fa4695695632545d3aff1d"), "x" : { "text" : "test", "num" : 2 } }
{ "_id" : ObjectId("55fa468f695632545d3aff1c"), "x" : { "text" : "test", "num" : 100 } }
> db.bar.find().sort({x:-1})
{ "_id" : ObjectId("55fa468f695632545d3aff1c"), "x" : { "text" : "test", "num" : 100 } }
{ "_id" : ObjectId("55fa4695695632545d3aff1d"), "x" : { "text" : "test", "num" : 2 } }
{ "_id" : ObjectId("55fa468a695632545d3aff1b"), "x" : { "text" : "test", "num" : 1 } }
{ "_id" : ObjectId("55fa469b695632545d3aff1e"), "x" : { "text" : "sweet", "num" : 2 } }
{ "_id" : ObjectId("55fa469d695632545d3aff1f"), "x" : { "text" : "sweet", "num" : 1 } }

为什么标签大于1000是一个问题?为什么会返回999?@YuriZarubin,如果你对
test999,test1000
进行降序排序,你会发现
test999
排在第一位,尽管
test1000
更高。那是因为
9
1
先到,长度没有关系,我就是这么想的。我的意思是,这个问题不仅仅限于1000以上的数字,这听起来就像你说的。你能展示一下你的mongoose/mongo查询代码吗。我以1000为例,但它每10^x发生一次。。。将更新我的帖子