首页 > 解决方案 > endAt 尝试从末尾再次搜索时如何停止?

问题描述

在 Firebase RealtimeDatabase 中使用 endAt() 时我被卡住了。我的结果中出现了一些不正确的值。这是我的代码:

  resuftObj = await messagesRef
          .child("test")
          .orderByChild("country")
          .endAt("ja", "9")
          .limitToLast(4)
          .once("value");

这是我的示例数据或视图:
|-test:
|---1:{ "country" : "us", "id" : 1 },
|---2:{ "country" : "ja", "id " : 2 },
|---3:{ "country" : "ca", "id" : 3 },
|---4:{ "country" : "uk", "id" : 4 },
| ---5:{ "国家" : "我们", "id" : 5 },
|---6:{ "国家" : "ca", "id" : 6 },
|---7:{ “国家”:“英国”,“id”:7 },
|---8:{“国家”:“ja”,“id”:8 },
|---9:{“国家”:“我们", "身份证" : 9 }

图片

我希望返回带有“country”=“ja”的对象。但我看到两个值 3 和 6(“country”=“ca”)。我的想法是,当它达到 id=2 时,我的 Query 找不到更多结果,所以从最后(id=9)重新搜索。如何防止这种情况?
结果:

{
    "2": {
        "country": "ja",
        "id": 2
    },
    "3": {
        "country": "ca",
        "id": 3
    },
    "6": {
        "country": "ca",
        "id": 6
    },
    "8": {
        "country": "ja",
        "id": 8
    }
}

标签: node.jsfirebasefirebase-realtime-database

解决方案


要进一步将结果限制为仅country等于的结果ja,您还必须指定startAt("ja")

ref.orderByChild("country")
          .startAt("ja")
          .endAt("ja", "9")
          .limitToLast(4)

还可以在这里查看我的复制:https ://jsbin.com/fajegol/edit?js,console

更新:更容易看出为什么你会ca以正确的顺序打印结果(我最初没有这样做):

ref.orderByChild("country")
          .endAt("ja", "8")
          .limitToLast(4)
.once("value", function(snapshot) {
  snapshot.forEach(function(child) {
    console.log(child.val());
  })
});

给出这个输出:

{“国家”:“ca”,“id”:3}

{“国家”:“ca”,“id”:6}

{“国家”:“ja”,“id”:2}

{“国家”:“ja”,“id”:8}

这样就更有意义了:子节点是按顺序排列的country,这是您告诉它的节点之前的最后 4 个节点endAt()

您问题中的输出来自 logging snapshot.val(),它为您提供没有您请求的顺序的结果(因为 JSON 中的键根据定义是无序的)。


推荐阅读