Javascript 如何从firebase用户列表中获取随机用户?

Javascript 如何从firebase用户列表中获取随机用户?,javascript,firebase,Javascript,Firebase,我正在开发一个应用程序,需要从我的firebase用户列表中获取一个随机用户。每当用户注册时,系统都会更新特定节点上的用户计数。所以,我画了一个从1到用户总数的数字。现在,我如何根据该号码选择用户?如果您谈论的是经过身份验证的用户,检索他们列表的唯一方法是调用相应的用户,然后对其应用您的逻辑 另一种方法是写入一个用户ID并用递增的数字存储该用户ID(可能还保存一个totalUser字段),然后您只需要生成一个随机数并访问该用户。假设您的所有用户都存储在一个/users节点中,并带有uid密钥,并

我正在开发一个应用程序,需要从我的firebase用户列表中获取一个随机用户。每当用户注册时,系统都会更新特定节点上的用户计数。所以,我画了一个从1到用户总数的数字。现在,我如何根据该号码选择用户?

如果您谈论的是经过身份验证的用户,检索他们列表的唯一方法是调用相应的用户,然后对其应用您的逻辑


另一种方法是写入一个用户ID并用递增的数字存储该用户ID(可能还保存一个totalUser字段),然后您只需要生成一个随机数并访问该用户。

假设您的所有用户都存储在一个/users节点中,并带有uid密钥,并且假设uid是有序的(它们总是有序的),有几种选择

1) 将/users节点中的所有用户加载到一个数组中,并通过其索引选择所需的用户。假设我们想要第四个用户:

let usersRef = self.ref.child("users")
usersRef.observeSingleEvent(of: .value, with: { snapshot in
    let allUsersArray = snapshot.children.allObjects
    let thisUserSnap = allUsersArray[3]
    print(thisUserSnap)
})
虽然这只适用于少量用户,但如果每个节点中存储了10000个用户和大量数据,则可能会使设备无法承受

2) 创建一个单独的节点来存储uid。这是一个非常小的数据集,其工作方式与1)相同

3) 进一步减小数据集的大小。因为您知道有多少用户,所以可以将数据集分为两个部分并使用它们

使用与2相同的结构)

让uidNode=self.ref.child(“uids”)
让index=4//我们想要的节点
让totalNodeCount=8//uid的总量
让mid=totalNodeCount/2//中间节点

如果将用户数据存储在/users节点中,并将uid作为每个用户的密钥(请参见我的答案),这是一种相当常见的做法,因此会有一些选项来获取经过身份验证的用户数据。第二个建议的问题是,如果用户3被删除,会在顺序列表0、1、2、4、5、6中留下一个洞,然后如果生成了一个随机数,例如3,它就会中断。这是NoSQL数据库中应该避免使用数组的原因之一。
uids
  uid_0: true
  uid_1: true
  uid_2: true
  uid_3: true
  uid_4: true
  uid_5: true
  uid_6: true
  uid_7: true
let uidNode = self.ref.child("uids")

let index = 4 //the node we want
let totalNodeCount = 8 //the total amount of uid's
let mid = totalNodeCount / 2 //the middle node

if index <= mid { //if the node we want is in the first 1/2 of the list
    print("search first section")

    let q = uidNode.queryLimited(toFirst: UInt(index) )

    q.observeSingleEvent(of: .value, with: { snapshot in
        let array = snapshot.children.allObjects
        print(array.last) //the object we want will be the last one loaded
    })
} else {
    print("search second section")

    let q = uidNode.queryLimited(toLast: UInt(index) )

    q.observeSingleEvent(of: .value, with: { snapshot in
        let array = snapshot.children.allObjects
        print(array.first) //the object we want will be the first one loaded
    })
}