Javascript 在mongoose db中生成唯一的随机数而不重复?
我想根据mongoose db中的数字生成一个不应重复的随机数,我不想将其用于唯一的数字:Javascript 在mongoose db中生成唯一的随机数而不重复?,javascript,arrays,node.js,object,mongoose,Javascript,Arrays,Node.js,Object,Mongoose,我想根据mongoose db中的数字生成一个不应重复的随机数,我不想将其用于唯一的数字: Math.floor(Math.random()*1000000000) 我在php中找到了这个答案 除了在mongoose中,我怎样才能做到这一点呢?我不相信在数据库中可以做到这一点,就像您的SQL示例一样。 有一个将$rand运算符添加到聚合管道的票证,但该票证仍未解决: 尽管如此,您仍然可以创建一个数据库函数(性能可能很差)并将其存储在服务器上: 不过,这并不是一个真正的猫鼬解决方案 您可以生成
Math.floor(Math.random()*1000000000)
我在php中找到了这个答案
除了在mongoose中,我怎样才能做到这一点呢?我不相信在数据库中可以做到这一点,就像您的SQL示例一样。 有一个将$rand运算符添加到聚合管道的票证,但该票证仍未解决: 尽管如此,您仍然可以创建一个数据库函数(性能可能很差)并将其存储在服务器上:
不过,这并不是一个真正的猫鼬解决方案 您可以生成随机数并检查它是否尚未存储:
function getNumber(callback){
var n = Math.floor(Math.random()*1000000000);
YourModel.findOne({'number': n}, function(err, result){
if (err) callback(err);
else if (result) return getNumber(callback);
else callback(null, n);
});
}
getNumber(function(error, number){
console.log(number);
});
如果您认为此过程可以并行调用多次,则应执行一些附加检查:
var alreadyRuning = false;
function getNumber(callback){
if (alreadyRuning) return setTimeout(function(){
getNumber(callback);
}, 10);
alreadyRuning = true;
var n = Math.floor(Math.random()*1000000000);
YourModel.findOne({'number': n}, function(err, result){
if (err) callback(err);
else {
alreadyRuning = false;
if (result) return getNumber(callback);
else callback(null, n);
}
});
}
getNumber(function(error, number){
console.log(number);
//...
YourModel.insert({'number': n}, function(err, result){
if (!err) alreadyRuning = false
});
});
可能重复
var alreadyRuning = false;
function getNumber(callback){
if (alreadyRuning) return setTimeout(function(){
getNumber(callback);
}, 10);
alreadyRuning = true;
var n = Math.floor(Math.random()*1000000000);
YourModel.findOne({'number': n}, function(err, result){
if (err) callback(err);
else {
alreadyRuning = false;
if (result) return getNumber(callback);
else callback(null, n);
}
});
}
getNumber(function(error, number){
console.log(number);
//...
YourModel.insert({'number': n}, function(err, result){
if (!err) alreadyRuning = false
});
});