我想根据我的猫鼬数据库中的数字生成一个不应重复的随机数,我不想将其用于唯一数字:
Math.floor(Math.random()*1000000000)
我找到了这个答案,该答案在php here
中SELECT FLOOR(RAND() * 99999) AS random_num
FROM numbers_mst
WHERE "random_num" NOT IN (SELECT my_number FROM numbers_mst)
LIMIT 1
除了猫鼬,我该怎么办?
答案 0 :(得分:2)
您可以生成您的随机数并检查它是否尚未存储:
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
});
});
答案 1 :(得分:0)
我不认为可以在数据库上执行此操作,例如您的SQL示例。 有一个将$ rand运算符添加到聚合管道的票证,但该票证仍未解决:
https://jira.mongodb.org/browse/SERVER-30405
仍然,您可以创建一个数据库功能(可能会降低性能)并将其存储在服务器上:https://docs.mongodb.com/manual/tutorial/store-javascript-function-on-server/
但是,这并不是真正的猫鼬解决方案。