简体   繁体   English

在mongoose db中生成唯一的随机数而不重复?

[英]generate unique random number in mongoose db without repeat?

i want to generate a random number which should not be repeated based on the numbers from my mongoose db, i don't wanna use this for a unique number: 我想生成一个不应该根据我的猫鼬数据库中的数字重复的随机数,我不想将它用于一个唯一的数字:

Math.floor(Math.random()*1000000000)

i found this answer which is in 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

how can i do that but in mongoose? 我怎么能这样做,但在猫鼬?

You could generate your random number and check that it is not already stored: 您可以生成随机数并检查它是否已存储:

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);
});

If you think this process could be called more than once in parallel, you should do some additional checks: 如果您认为此进程可以多次并行调用,则应进行一些额外的检查:

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
    });
});

I don't believe it is possible to do this on the database, like your SQL-example. 我不相信可以在数据库上执行此操作,就像您的SQL示例一样。 There is a ticket for adding a $rand operator to the aggregation pipeline, but that ticket is still unresolved: 有一个将$ rand运算符添加到聚合管道的票证,但该票证仍未解决:

https://jira.mongodb.org/browse/SERVER-30405 https://jira.mongodb.org/browse/SERVER-30405

Still, you could create a database-function (which can have a bad performance) and store it on the server: https://docs.mongodb.com/manual/tutorial/store-javascript-function-on-server/ 不过,您可以创建一个数据库函数(可能性能不佳)并将其存储在服务器上: https//docs.mongodb.com/manual/tutorial/store-javascript-function-on-server/

That's not really a mongoose solution, though. 不过,这并不是一个真正的猫鼬解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM