【问题标题】:Firebase orderByKey().startAt() not working as expected. What's wrong?Firebase orderByKey().startAt() 未按预期工作。怎么了?
【发布时间】:2019-08-15 02:31:20
【问题描述】:

我正在尝试从 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”,我不应该得到任何数据。但我总是得到图片中显示的数据。我应该使用另一种查询方式吗?或者我应该在订单和付款数据中使用关键字段?

问候!

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    尝试以下方法:

    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()方法中的参数添加)的快照是否已存在于数据库中,然后您将能够检索userId下的数据。

    供参考:

    https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#exists

    【讨论】:

      【解决方案2】:

      彼得的答案是正确的解决方案。我只是为了完整性而添加这个。

      当您在 Firebase 引用上调用 orderBy... 时,数据库会对您指定的键/值/子项上的所有子节点进行排序。

      如果您随后在查询中调用startAt(...),它会找到以该值开头的(第一个)节点并开始从那里返回所有结果。因此,如果您从FKQLlqa 开始,它将在FKQLlqa 开始返回键,然后返回它之后的所有键。

      如果您想返回具有特定键/值/子节点的子节点,您可以使用equalTo(...)。所以:

      ref.orderByKey().equalTo(userUID).once("child_added", function(snapshot) {
        ... 
      

      但正如彼得已经说过的那样,这只是用已知密钥查找孩子的一种更昂贵的方式。我强烈推荐使用他更好的方法:ref.child(userUID).once("value"

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 2018-03-27
        • 1970-01-01
        • 2018-11-24
        • 1970-01-01
        相关资源
        最近更新 更多