在我的 React-Native 应用程序中,我有一组特定用户,我想从 Firebase 中提取他们的值。解决此问题的最有效方法是什么?目前我正在遍历数组并为每个数组发出一个新请求(下面的相关代码):
const usersRef = new Firebase(`${ config.FIREBASE_ROOT }/users`)
for (var key in usersArray) {
var userRef = usersRef.child(key);
//do stuff here
}
但是,我觉得这不是很有效,它会向数据库发出多个请求。有没有一种方法可以在一次调用中传入数组并从 Firebase 获取这些项目?谢谢。
Firebase 数据结构:
{
"items" : [ {
"description" : "fuzzy socks",
"type" : "toy"
}, {
"description" : "bouncy ball",
"type" : "toy"
}, {
"description" : "scrabble",
"type" : "game"
}, {
"description" : "construction paper",
"type" : "crafts"
} ],
"users" : [ {
"itemList" : [ 1, 2, 3, 4 ],
"description" : "brown",
}, {
"itemList" : [ 5, 6, 7 ],
"description" : "green",
}, {
"itemList" : [ 8, 9, 10 ],
"description" : "blue",
}, {
"itemList" : [ 11, 12, 13 ],
"description" : "yellow",
} ]
}
简化用例:在一个用例中,我只想获取有关 2 个用户的信息(在我存储在 Firebase 中的所有用户中——假设它不仅仅是上面结构中的 4 个)。所以,我有数组 importantUsers :
var importantUsers = [0, 3]
然后,我想向 Firebase 发送一个请求,该请求仅在数据库中查询与这些 userID 值关联的值(因此以某种方式将数组传递给 Firebase 以获得结果)。返回值是这样的:
0: itemList: [1,2,3,4], description: brown
3: itemList: [11,12,13], description: yellow
我一次查询多个用户的数据库(而不是为用户 0 和用户 3 创建单独的引用)的动机是不要多次调用 Firebase。有没有办法解决这个问题?
Best Answer-推荐答案 strong>
所以你所追求的是一个 sql 'in' 类型的查询。在 [0,2] 中选择。从列表中选择多个用户。
您问题中的另一个挑战是您感兴趣的用户是随机的,因此您不能使用 .startAt 和 .endAt,并且用户之间没有其他关系。
Firebase 不直接支持“in”、“and”或“or”类型的查询,但有多种方法可以实现。
怎么样:标记你想要的用户,然后用一个查询,读入他们。
首先,您将从一个典型的 Firebase/users 节点开始,并添加一个“选定”子节点(最初可以省略,但我在这里将其显示为占位符)
users
uid_0
name: "Bud"
selected: false
uid_1
name: "Henry"
selected: false
uid_2
name: "Billy"
selected: false
然后,我们需要一些随机的 uid,比如 uid_0 和 uid_2,并将它们存储在一个数组中。请记住,我们将使用 Firebase 生成的 uid,但为了简单起见,我们将使用 uid_0、uid_1 等。
只有两个用户,您可以在两个节点上分别观察SingleEventOfType,没什么大不了的。
但是,如果我们需要 100 个随机用户或 1000 个用户,则应避免执行 1000 个单独的查询或observeSingleEvent。但是,setValue 非常快(没有返回数据)所以....
获取我们的用户引用
let usersRef = myRootRef.ChildbyAppendingPath("users")
我们通过遍历数组来构建这些 ref 并将 selected 设置为 true,从而知道我们想要的 100 个用户的路径
for uid in uidArray {
let thisUserRef = usersRef.childByAppendingPath(uid)
let selectedRef = thisUserRef.childByAppendingPath("selected")
selectedRef.setValue(true)
}
然后,您可以在 usersRef 中查询选定的 child = true 的所有用户。
一旦你有了它们,清理,迭代返回的用户并将 selected 设置为 false 或 nil
这很酷的一点是,setValue 可以非常快速地通过 100 或 1000 个用户而没有开销,将他们选择的 child 设置为 true。然后一个查询就可以返回你想要的值。
写出然后读回的逻辑似乎几乎是相反的,但我很确定这比遍历数组并生成 1000 个查询或观察者要好得多。
(Firebase 的人可以检查我的那个)
另一个想法是,如果用户说,单击列表中的其他用户,您可以在他们单击时设置 selected = true,然后在用户完成时查询这些用户。
关于ios - 如何从 Firebase 获取一组对象?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/37053906/
|