【问题标题】:Firebase orderByPriority used with equalTo strange behaviorFirebase orderByPriority 与 equalTo 奇怪的行为一起使用
【发布时间】:2016-08-18 07:22:19
【问题描述】:

我在使用orderByPriority()时尝试使用equalTo(value, key)的第二个参数,如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,但没有得到任何答案...

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案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)
    

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

    【讨论】:

    • 这不起作用:Error: Query.orderByKey: You can't combine multiple orderBy calls。另外,您在哪里看到equalTo() 过滤器只会获取与键匹配的项目?文档说:The child key to start at, among the children with the previously specified priority.
    • 为了回答您的问题,您只能根据一个值进行过滤。这正是 Firebase 查询的本质
    • 当使用 startAt() 时,第二个参数用于在多个值相同时从指定的键开始,根据文档 - 并且它有效equalTo() 文件大致相同,但实际行为不同,为什么?这是我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多