如何在 Firebase 上随机获取相同的数据?

Posted

技术标签:

【中文标题】如何在 Firebase 上随机获取相同的数据?【英文标题】:How can I randomly get same data on Firebase? 【发布时间】:2018-07-14 19:30:09 【问题描述】:

我有用户表和这段代码。

获取在线代码和连接按钮

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

我已经可以看到 online=1 个用户,但我想随机获取 1 个 online=1 个用户。

我该怎么做?

更新

我想建立随机聊天。人们将根据标准进行匹配。像火种应用程序。想想看,有一个页面和一个按钮。当用户按下按钮时,它将匹配任何在线用户。和聊天。

firebase 用户;

users
     VIkvYAtLHxNqAwd722oKenriM7PJz2
        email: "mail@hotmail.com"
        online: 1 
        profile_picture:"https://scontent.xx.fbcdn.net" 
        username: "John Snow"

     DIkvYAtLHxNqAwd722oKenriM7PJz2
        email: "mail2@hotmail.com"
        online: 1 
        profile_picture:"https://scontent.xx.fbcdn.net" 
        username: "Jane Snow"

【问题讨论】:

我是最新的,我正在尝试与有天赋的聊天进行随机匹配的聊天 看看我更新的答案 【参考方案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: 我发现您不能在 forEach 循环中使用 break。所以你可以使用here提供的解决方案来解决这个问题(使用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;
    
);

【讨论】:

感谢您的帮助!!! :) 而且我不理解limitToFirst,因为我将匹配过滤器“所有用户的年龄,位置和性别。例如:我在同一位置有一个1k用户。这段代码都检查1k用户并使用limitToFirst(50)? 这段代码有效,但我匹配了自己的用户。我怎样才能排除我自己的用户?因为 currentUser online = 1 太:/ 谢谢。 我的坏@Cœur。索引发生了变化,因为我使用了编辑器上的超链接按钮。下次我会手动编辑它。谢谢 @RosárioPereiraFernandes 哦,有趣的是,我不知道使用编辑器的这种副作用。感谢您的提示。 @RosárioPereiraFernandes 感谢更新但中断;显示错误,因此无法正常工作。并且不间断;代码正在运行,但所有在线 = 1 个用户获得:S

以上是关于如何在 Firebase 上随机获取相同的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从父级及其子级的 Firebase 中获取随机数据 [重复]

如何防止 Firebase 上的匿名密钥?

如何在不从参考节点获取所有数据的情况下获取 Firebase 数据库中的随机键?

从 Firebase 获取随机用户

Firebase Android - 如何随机获取一些项目[重复]

如何使用顺序 ID 从 Firebase 检索随机对象?