Firebase orderByPriority使用equalTo奇怪的行为

时间:2016-08-17 16:07:08

标签: firebase firebase-realtime-database

在使用equalTo(value, key)时,我尝试使用orderByPriority()的第二个参数,documented here

问题是当使用第二个key参数时结果不一致。

示例数据集

items
  key1
  key2
  key3
  key4

所有项目具有相同的优先级:10(这仅用于示例,在我的应用中还有其他项目具有其他优先级)

发出以下Firebase查询以获取具有该优先级的前两个项目时:

dbRef.child('items').orderByPriority().equalTo(10).limitToFirst(2)

我得到以下 - 预期 - 结果:

{ "key1": ..., "key2": ... }

然后我尝试在key2项之后得到结果,如文档中所述:

dbRef.child('items').orderByPriority().equalTo(10, 'key2').limitToFirst(2)

结果非常奇怪,总是只有一个项目,即提供密钥的项目:

{ "key2": ... }

我所期待的是两个结果开始,提供的密钥后开始,所以

{ "key2": ..., "key3": ... }

或者

{ "key3": ..., "key4": ... }

问题

我应该如何使用equalTo()过滤器及其第二个参数?

似乎这个问题是already asked,但它没有得到任何答案......

1 个答案:

答案 0 :(得分:1)

equalTo()过滤器只会获取与指定键完全匹配的项。如果您想从'key2'开始并在此之后获得多个,请使用startAt()过滤器。但是,您不能在同一查询中使用多个orderBy语句,因此您可能需要重新格式化代码。我建议您按所需的优先级保存项目。然后,您可以使用startAt()过滤器查询该组项目。下面是一个数据集:

items10
  key1
  key2
items9
  key1
  key2

在startAt()过滤器中,指定起始键,然后它将查询具有相同或更大值的任何键。以下是此功能文档的链接:startAt()

使用此方法,limitToFirst(2)应该为您提供key2和key3。这是一个代码示例,使用优先级10。

    dbRef.child('items10').orderByKey().startAt('key2').limitToFirst(2)

注意:您可能还需要抓住一个元素,而不知道它的优先级。为此,创建另一个名为仅包含所有键的项的键(您不会将其用于查询)。