在猫鼬数据库中生成唯一的随机数而无需重复?

时间:2019-06-03 09:22:03

标签: javascript arrays node.js object mongoose

我想根据我的猫鼬数据库中的数字生成一个不应重复的随机数,我不想将其用于唯一数字:

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

除了猫鼬,我该怎么办?

2 个答案:

答案 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/

但是,这并不是真正的猫鼬解决方案。