让我们假设数据库中的样本列表:
在以下片段中, 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 回答
看起来这确实是一个错误 . 特别是,如果您执行
limitToLast(...).startAt(...)
或limitToFirst(...).endAt(...)
,我们将最终撤消限制并提供不正确的结果 .简单的解决方法是始终确保您的
limitToXXX()
呼叫在查询中位于最后 . 这不应该试图在将来的版本中修复此问题 . 谢谢你报道这个!实际上,错误消息与
limit()
docs相结合,对已关闭的Firebase源代码有了一些了解:如果谓词按特定顺序应用,我的赌注仍然会回落到贬值
limit()
的实施 . 如果该订单改变了;使用不同的,可能更新且更正确的实现 . 这可以解释我的问题中证明的所有不一致和问题 .很抱歉回答我自己的问题,但是只有经过一番思考(并且正在玩!)之后我想出了这个问题 .
已经提交了Firebase的门票,他们可能会在这里回答 .