генерировать уникальное случайное число в мангусте без повторения? - PullRequest
3 голосов
/ 03 июня 2019

Я хочу сгенерировать случайное число, которое не должно повторяться на основе чисел из моей базы данных mongoose, я не хочу использовать это для уникального числа:

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

я нашел этот ответ, который находится в php здесь

SELECT FLOOR(RAND() * 99999) AS random_num
FROM numbers_mst 
WHERE "random_num" NOT IN (SELECT my_number FROM numbers_mst)
LIMIT 1

как я могу это сделать, но в мангусте?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Вы можете сгенерировать ваше случайное число и проверить, что оно еще не сохранено:

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
    });
});
0 голосов
/ 03 июня 2019

Я не верю, что это можно сделать в базе данных, как в вашем примере с SQL.Существует запрос на добавление оператора $ rand в конвейер агрегации, но этот запрос все еще не решен:

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

Тем не менее, вы можете создать функцию базы данных (которая может иметьплохая производительность) и сохраните его на сервере: https://docs.mongodb.com/manual/tutorial/store-javascript-function-on-server/

Это не совсем мангустное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...