Подтвердить что ты не робот

Как я могу получить случайные данные о Firebase?

У меня есть таблица пользователя и этот код.

код getOnline и подключенная кнопка

var onlineStatus = firebase.database().ref("users/" + firebase.auth().currentUser.uid + "/online");
onlineStatus.set(1);  

и

var dbUser = firebase.database();
var refUser = dbUser.ref("users");


refUser.orderByChild("online").equalTo(1).on("value", function(Data){
    console.log(Data.val(), Data.key);
});

Я уже вижу онлайн-пользователей 1, но я хочу случайно получить 1 пользователя, у которого есть онлайн = 1.

Как я могу это сделать?

Обновить

Я хочу создать случайный чат. люди будут соответствовать критериям. как приложение Tinder. Подумайте об этом, есть страница и кнопка. Когда пользователь нажимает кнопку, он будет соответствовать любому пользователю онлайн. и общение в чате.

пользователи firebase;

users
     VIkvYAtLHxNqAwd722oKenriM7PJz2
        email: "[email protected]"
        online: 1 
        profile_picture:"https://scontent.xx.fbcdn.net" 
        username: "John Snow"

     DIkvYAtLHxNqAwd722oKenriM7PJz2
        email: "[email protected]"
        online: 1 
        profile_picture:"https://scontent.xx.fbcdn.net" 
        username: "Jane Snow"
4b9b3361

Ответ 1

Вы можете использовать функцию Math.random(), чтобы получить случайное число (позвоните ему n). а затем введите n го пользователя:

refUser.orderByChild("online").equalTo(1).on("value", function(Data){
    console.log(Data.val(), Data.key);
    var totalOnline = Data.numChildren(); //get number of online users
    var randomNr = Math.random() * totalOnline;
    var userIndex = parseInt(randomNr, 10); //parse the random number from double to integer
    var currentIndex = 0;
    Data.forEach(function(snap){
        if(currentIndex==userIndex){
            var randomUser = snap.val();
            //Do something with your random user
            break;
        }
        currentIndex++;
    });
});

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

refUser.orderByChild("online").equalTo(1).limitToFirst(50)

Обновить. Чтобы исключить собственного пользователя, вы можете проверить, является ли ваш случайный пользователь. И если это так, перейдите к следующему:

        if(currentIndex>=userIndex && snap.key != firebase.auth().currentUser.uid){
            var randomUser = snap.val();
            //Do something with your random user
            break;
        }

Обновление 2: Я обнаружил, что вы не можете использовать цикл break on forEach. Поэтому вы можете решить это, используя предоставленное решение здесь (используйте BreakException):

refUser.orderByChild("online").equalTo(1).on("value", function(Data){
    console.log(Data.val(), Data.key);
    var totalOnline = Data.numChildren(); //get number of online users
    var randomNr = Math.random() * totalOnline;
    var userIndex = parseInt(randomNr, 10); //parse the random number from double to integer
    var currentIndex = 0;
    var BreakException = {};
    try
    {
        Data.forEach(function(snap){
            if(currentIndex==userIndex){
                var randomUser = snap.val();
                //Do something with your random user
                throw BreakException;
            }
            currentIndex++;
        });
    }
    catch(e){
        if(e!== BreakException) throw e;
    }
});