【问题标题】:What is the best way to do a IN query in firebase?在 Firebase 中进行 IN 查询的最佳方法是什么?
【发布时间】:2017-10-11 01:50:39
【问题描述】:

由于 firebase 数据库不支持从 equalTo 中的数组查询,我该如何在 firebase 中进行以下查询?

{
  'keyname': 'value1'
},
{
 'keyname': 'value2'
},
{
 'keyname': 'value3'
}

如何检索包含 value1 和 value2 的所有对象?我是使用 forEach 循环还是有另一种方法来取回值。

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    我相信您正在寻找包含 value1 value2的所有节点的查询。你的平台没有被指出,所以我会在高层次上解决它。

    解决方案 1 查询 value1 的所有节点,然后再次查询 value2 的所有节点

    方案2查询节点startingAt("value1").endingAt("value2")

    解决方案 3 添加一个结构以保持对符合这两个条件的节点的引用

    items
      node_0
        keyname: value1
      node_8
        keyname: value2
    
    value1_value2
       node_0: true
       node_8: true
    

    解决方案 4 确定值之间的共性。例如。假设 value1 是 Apple 而 value2 是 Pear。两者都是水果,你知道你的用户会想要所有的水果,所以查询 typeOf 是水果。您可以通过添加 growOn: Tree 来进一步扩展它。然后您可以查询所有在树上生长的项目。您甚至可以添加一个复合谓词 type_grown:Fruit_Tree,然后您可以查询所有长在树上的水果,而不是所有长在树上的坚果。

    {
      keyname: "Apple"
      typeOf: "Fruit"
    }
      keyname: "Pear"
      typeOf: "Fruit"
    }
    

    解决方案 5 加载整个节点并在代码中过滤(这是一种很好的方法,具体取决于数据集的大小)。

    解决方案 6 查询所有以 value 开头的节点,并拒绝所有不是 value1 或 value 2 的节点。在 Swift 中会是

    let nameQuery = usersRef.queryOrdered(byChild: "keyname")
                            .queryStarting(atValue: "value")
                            .queryEnding(  atValue: "value\u{f8ff}")
    

    请参阅我对this question 的回复,了解有关该问题的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2015-09-04
      • 2012-07-20
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      相关资源
      最近更新 更多