我正在尝试从uid必须以传递的字符串开头的节点获取firebase数据。
我尝试了一个代码,但是我总是得到相同的数据。数据库数据如下:
我正在使用以下代码:
var ref = firebase.database().ref("restaurantes/history");
ref.orderByKey().startAt(userUID).once("child_added", function(snapshot) {
snapshot.forEach(child => {
if(child.key == "orders")
{
console.log(child.val());
_.each(child.val(), (value, key) => {
arrtmp.push(value)
})
}
})
如果用户为“ FKQLlqa”,则应获取图片中显示的历史记录数据。如果我的用户是“ abc”,则不应获取任何数据。但是我总是得到图片中显示的数据。我应该使用其他查询方式吗?还是我应该在订单和付款数据中使用一个关键字段?
致谢!
答案 0 :(得分:2)
尝试以下操作:
var ref = firebase.database().ref("restaurantes/history");
ref.child(userUID).once("value", function(snapshot) {
if (snapshot.exists()) {
console.log(snapshot.val());
}
else {
console.log("different user");
});
这将检查数据库中是否已经包含包含userId
(作为child()
方法中的参数添加)的快照,然后您就可以在{{ 1}}。
供参考:
https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#exists
答案 1 :(得分:1)
Peter的答案是正确的解决方案。我只是为了完整性而添加它。
当您在Firebase参考上调用orderBy...
时,数据库将对您指定的键/值/子节点上的所有子节点进行排序。
如果您随后在查询中调用startAt(...)
,它将找到以该值开头的(第一个)节点,然后 starts 从那里返回所有结果。因此,如果您从开始FKQLlqa
,它将在FKQLlqa
处开始返回键,然后在其后返回所有键。
如果要返回带有特定键/值/子节点的子节点,则可以使用equalTo(...)
。所以:
ref.orderByKey().equalTo(userUID).once("child_added", function(snapshot) {
...
但是,正如彼得已经说过的那样,这只是查找具有已知钥匙的孩子的一种更昂贵的方法。我强烈建议使用他更好的方法:ref.child(userUID).once("value"
。