【问题标题】:Firebase results range using startAt and endAtFirebase 结果范围使用 startAt 和 endAt
【发布时间】:2016-01-26 22:39:06
【问题描述】:

我正在尝试从我的 Firebase 数据中获取前 100 个结果,然后是接下来的 100 个,然后是接下来的 100 个等等。我尝试了多种方法。

版本 1

ref.child('products').orderByChild('domain').startAt(0).endAt(100).once('value').then(function(snapshot) {});

第 2 版

ref.child('products').orderByChild('domain').startAt(0).limitToFirst(100).once('value').then(function(snapshot) {});

版本 3

ref.child('products').startAt(0).endAt(100).once('value').then(function(snapshot) {});

每次返回的快照都是空的。 Firebase 中是否有获取我想要的数据范围的方法?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    当您调用orderByChild() 时,对startAt()endAt()equalTo() 的任何后续调用都期望您传入的值是一个孩子。您正在传递一个索引。除非domain 的值是顺序索引(极不可能),否则这将不起作用。

    您应该做的是记住您获得的最后一个孩子的domain 值,然后将其传递给startAt() 以用于下一个“页面”。

    var productsRef = ref.child('products');
    var lastKnownDomainValue = null;
    var pageQuery = productsRef.orderByChild('domain').limitToFirst(100);
    pageQuery.once('value', function(snapshot) {
      snapshot.forEach(function(childSnapshot) {
        lastKnownDomainValue = childSnapshot.child('domain').val();
      });
    });
    

    现在你有一个变量lastKnownDomainValue,它包含你见过的最后一个域。要获得下一批孩子,您可以将该值传递给 startAt()

    var nextQuery = productsRef.orderByChild('domain').startAt(lastKnownDomainValue).limitToFirst(100);
    

    然后,当您再次循环遍历孩子时,您会更新 lastKnownDomainValue

    【讨论】:

    • 你不能将pageQuerynextQuery 折叠成一个可以接受任何范围的函数吗?
    • @frank-van-puffelen 你是说 Firebase 不支持有起始值(比如日期)和结束值的范围查询吗?如果是这样,Firestore 是否也有这个限制?
    • @Aodh Range 查询具有开始值和结束值在两者上都是可能的。如果您遇到问题,请使用最少的代码发布问题,以重现您遇到的问题。
    猜你喜欢
    • 2015-06-28
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多