我目前有一个有两个字段的数据库。其中只有一个对于这个问题的目的很重要。
想象一个带有单个字符串字段的数据库(让我们称之为"标记"),以及以下模式:[a-z]*[0-9]*
,如:
我的应用程序需要生成新的"标签",给定前缀"标识符" (例如test
或some
)。
因此,我要说我输入test
作为前置名称,100
作为"标记"的数量。生成。
test
的LAST代码。此特定情况下的输出为:test131
,test132
,...,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);
});
},
答案 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