在猫鼬数据库中生成唯一的随机数而不重复?
Posted
技术标签:
【中文标题】在猫鼬数据库中生成唯一的随机数而不重复?【英文标题】:generate unique random number in mongoose db without repeat? 【发布时间】:2019-10-18 20:00:27 【问题描述】:我想根据我的猫鼬数据库中的数字生成一个不应重复的随机数,我不想将其用作唯一数字:
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
除了猫鼬,我怎么能做到这一点?
【问题讨论】:
***.com/questions/2380019/…的可能重复 【参考方案1】:您可以生成随机数并检查它是否尚未存储:
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
);
);
【讨论】:
【参考方案2】:我不相信可以在数据库上执行此操作,例如您的 SQL 示例。 有一张将 $rand 运算符添加到聚合管道的票,但该票仍未解决:
https://jira.mongodb.org/browse/SERVER-30405
不过,您可以创建一个数据库函数(性能可能会很差)并将其存储在服务器上:https://docs.mongodb.com/manual/tutorial/store-javascript-function-on-server/
不过,这并不是真正的猫鼬解决方案。
【讨论】:
以上是关于在猫鼬数据库中生成唯一的随机数而不重复?的主要内容,如果未能解决你的问题,请参考以下文章