首页 文章

Firebase查询过滤谓词顺序依赖和行为怪异

提问于
浏览
3

让我们假设数据库中的样本列表:

enter image description here

在以下片段中, ref 是:
var ref = firebase.database().ref().child('test').orderByKey();

我注意到2个查询的奇怪行为:

  • ref.limitToFirst(2).endAt('5')
    它产生 4, 5 ,而我预计 0, 1 .
    2件事令人惊讶:

  • 如果交换了谓词的顺序: ref.endAt('5').limitToFirst(2)
    结果还可以: 0, 1
    _1896200_的

  • 结果也是 4, 5 .
    正如预期的那样,但是, limitToLast() 不应该像 limitToFirst() 这样工作 .

  • ref.limitToLast(2).startAt('5')
    同样地,即使人们可以期待 8, 9 .
    和上面类似:

  • ref.startAt('5').limitToLast(2) 工作正常( 8, 9

  • ref.limitToFirst(2).startAt('5') 同样的结果( 5, 6

现在,它只是我不理解firebase查询 .
文档和API参考都没有提到谓词顺序的重要性 .

我正在使用Firebase 3.X(3.3.0)进行网络处理 .
剪切用于显示结果列表:

ref.once('value').then(function(snap) {
  snap.forEach(function(child) {
    console.log(child.key);
  });
});

抱歉没有意义的 Headers . 如果您有更好的主意,请提交修改提案 .

Edit:

limitTo*() 谓词是在Firebase 2.0.0中引入的 . 在它们之前它只是 limit() .
只有 limit() 和( startAt()endAt() )表示从结果列表中选择的顺序,它可以原谅上面的矛盾结果(但是 not 查询在谓词交换时正常工作) .

但是, startAt()endAt() 可以同时使用,因此它们可以't denote the direction (or at least shouldn't) .

让我们玩:

  • ref.startAt('5').endAt('9').limitToFirst(3)5, 6, 7 - 好的

  • ref.startAt('5').endAt('9').limitToLast(3)7, 8, 9 - 好的

  • ref.limitToFirst(3).startAt('5').endAt('9')ref.startAt('5').limitToFirst(3).endAt('9')
    未捕获错误:查询:无法组合startAt(),endAt()和 limit() . 请改用limitToFirst()或limitToLast() .

:-D
我猜错了 .

Edit 2:

正如我所预料的那样 . 来自limit() docs

如果与startAt()结合使用,查询将在起始点后包含指定数量的子项 . 如果与endAt()结合使用,查询将在结束点之前包含指定数量的子节点 .

2 回答

  • 3

    看起来这确实是一个错误 . 特别是,如果您执行 limitToLast(...).startAt(...)limitToFirst(...).endAt(...) ,我们将最终撤消限制并提供不正确的结果 .

    简单的解决方法是始终确保您的 limitToXXX() 呼叫在查询中位于最后 . 这不应该试图在将来的版本中修复此问题 . 谢谢你报道这个!

  • 1

    实际上,错误消息与 limit() docs相结合,对已关闭的Firebase源代码有了一些了解:

    如果谓词按特定顺序应用,我的赌注仍然会回落到贬值 limit() 的实施 . 如果该订单改变了;使用不同的,可能更新且更正确的实现 . 这可以解释我的问题中证明的所有不一致和问题 .

    很抱歉回答我自己的问题,但是只有经过一番思考(并且正在玩!)之后我想出了这个问题 .
    已经提交了Firebase的门票,他们可能会在这里回答 .

相关问题