Firebase orderByKey()。startAt()无法正常工作。怎么了?

时间:2019-03-24 19:41:27

标签: javascript firebase firebase-realtime-database

我正在尝试从uid必须以传递的字符串开头的节点获取firebase数据。

我尝试了一个代码,但是我总是得到相同的数据。数据库数据如下:

enter image description here

我正在使用以下代码:

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”,则不应获取任何数据。但是我总是得到图片中显示的数据。我应该使用其他查询方式吗?还是我应该在订单和付款数据中使用一个关键字段?

致谢!

2 个答案:

答案 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"