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

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/

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

【讨论】:

以上是关于在猫鼬数据库中生成唯一的随机数而不重复?的主要内容,如果未能解决你的问题,请参考以下文章

Hive中生成随机唯一标识ID的方法

我怎样才能重复这个查询 100 次?

Model.find() 在猫鼬中返回空 [重复]

Model.find() 在猫鼬中返回空 [重复]

在猫鼬中填充+聚合[重复]

当我想在猫鼬中从数据库中查找文档时,函数返回未定义 [重复]