Javascript 在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运算符添加到聚合管道的票证,但该票证仍未解决: 尽管如此,您仍然可以创建一个数据库函数(性能可能很差)并将其存储在服务器上: 不过,这并不是一个真正的猫鼬解决方案 您可以生成

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

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