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