在 Firebase 中使用带有嵌套键的 .indexOn

Posted

技术标签:

【中文标题】在 Firebase 中使用带有嵌套键的 .indexOn【英文标题】:Using .indexOn with nested keys in Firebase 【发布时间】:2014-11-27 21:48:07 【问题描述】:

我有一堆要使用.indexOn索引的键

假设我的数据如下所示。我希望能够使用.orderByChild("height")


  "lambeosaurus": 
    "stats": 
      "height" : 2.1,
      "length" : 12.5,
      "weight": 5000
    
  ,
  "stegosaurus": 
    "stats": 
      "height" : 4,
      "length" : 9,
      "weight" : 2500
    
  

我如何指定索引height 的规则,它是stats 的子级?我是否必须重组或扁平化我的数据?

【问题讨论】:

据我所知,这种更深层次(或多值)的索引(还)是不可能的。我们在这里谈到了类似的事情 (***.com/questions/26910242/…),我还没有看到 Firebaser 的任何回应说它可能的;我无法让重要的(即多值)键正常工作。因此,目前看来您必须为这些创建自己的索引,如我链接到的答案中所述。 【参考方案1】:

现在可以任意深度查询和索引。


  "rules": 
    "$dinosaur": 
      ".indexOn": ["stats/height"]
       
  

并查询嵌套值:

.orderByChild('stats/height')

【讨论】:

我收到错误消息。未捕获的错误:Query.orderByValue 失败:使用 1 个参数调用。预计没有。(…) @akshay try .orderByChild('stats/height')【参考方案2】:

2015/12/17 更新:Firebase 现在支持深度索引,请参阅 Tom 的回答。


您可以在数据树中任意嵌套索引规则,但一次只能查询一个元素列表的属性 - 不是任意深度。以下是一些示例规则,用于索引高度:


  "rules": 
    "$dinosaur": 
      "stats": 
        ".indexOn": ["height"]
      
       
  

【讨论】:

那么我该如何查询呢?我尝试使用以下内容设置查询,但没有返回任何内容。谢谢你的帮助。 var fb = new Firebase("https://a_fb_ur./dinosaur");fbQuery = fb.orderByChild("height").equalTo(4); 您必须展平您的数据才能执行该查询,然后您需要附加一个侦听器来检索数据。即new Firebase(...).child('dinosaurs').orderByChild('height').on('child_added', function(snapshot) ... ). 好的;对于存储GeoJSON,我可能想要展平数据,然后因为我通常想要索引和搜索存储在嵌套“属性”键中的键。感谢您的确认。 完整查询是new Firebase(...).child('dinosaurs').orderByChild('height').equalTo(4).on(...) 无论如何,Firebase 文档没有给出应用于索引的通配符节点的示例,因为它应用于安全规则,它也适用于索引是合乎逻辑的。感谢您的想法

以上是关于在 Firebase 中使用带有嵌套键的 .indexOn的主要内容,如果未能解决你的问题,请参考以下文章

更新 Firebase 中键的值

具有相同键的(嵌套)字典的 Pythonic 替代方案?

带有嵌套对象的实体框架数据插入,该对象具有一个请求的自动递增主键

带有嵌套序列化程序的 Django 反向外键给出了多个结果

更新firestore文档中嵌套对象中的字段?

在嵌套字典中查找特定键的值