【问题标题】:Filtering Firebase object based on nested array基于嵌套数组过滤 Firebase 对象
【发布时间】:2016-12-01 11:24:18
【问题描述】:

我的 Angular2 应用中有一个带有一组标签的图像的 Firebase 列表。我正在寻找一种方法来返回所有带有“Tag1”的图像。这可以使用sort_by 函数吗?

let arrayOfElements = 
    [
        {
           "name": "a",
           "subElements": 
           [
             {0: "Tag1"},
             {1: "Tag2"}
           ]
        },
        {
           "name": "a",
           "subElements": 
           [
             {0: "Tag1"},
             {1: "Tag3"}
           ]
        }
    ];

【问题讨论】:

  • 请看一下这可能对你有帮助stackoverflow.com/questions/40844795/…
  • 只需替换 .orderByChild("name") .equalTo(edittext.getText().toString()); to orderByChild("0").equalTo("Tag1")
  • 谢谢塔比什!但是,“Tag1”也可以有 id: 2 例如。是否可以在不知道我正在搜索的字典键的情况下进行此搜索?
  • 为此,您必须将 Tag1、Tag1、Tag3 分隔在一个单独的表中,并且只将 id 作为键放在子元素中
  • 我明白了。使用 javascript 过滤器方法似乎也可以,但我想知道是否应该避免使用这种方法 arrayOfElements.map(res => res.filter(r => r. subElements.indexOf("Tag1") > -1)) .subscribe (结果 => 控制台日志(结果))

标签: angular firebase firebase-realtime-database observable


【解决方案1】:

现在你需要坐下来想一想,为什么?原因是你在 firebase 中遇到了一个典型的问题......回答这个问题:

  • arrayOfElements可以无限吗?
  • arrayOfElements大小可以小于 100(例如)?

为什么您需要回答这些问题?假设您有一个包含 10.000 个项目(或无限项)的数组,如果您使用 orderByChild("0").equalTo("Tag1"),firebase 数据库需要读取所有项目以找到具有“Tag1”的项目,那么您的应用/网络需要更多时间数据来获取这个查询的结果,那么这里我们需要开始讨论规范化firebase数据库,是时候创建索引了,你可以看到我昨天的post 我解释了它。

如果您在第二个问题中的答案是YES,那么您可以使用此命令获取值orderByChild("0").equalTo("Tag1"),因为在其他情况下消耗的数据和浪费的时间太少...您可以解决这个问题在 firebase 数据库规则中添加 indexOn()。分析您的数据库并确定最佳选择。


更新

关于您的评论...如果您没有 id 或不需要 firebase 唯一 id,那么最好的形式是这样做,对我来说就是这个:

arrayOfElements{
    tag1:"true",
    tag2:"true"
}

只需将键作为值。

让我知道我是否对您有帮助并进行良好的编程!

【讨论】:

  • 谢谢。在我的情况下,它将是 res.filter(r => r.subElements.indexOf("Tag1") > -1)) .subscribe(result => console.log(result))
  • 我的答案已更新,请阅读并告诉我您的想法! ;)
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2020-03-11
  • 2021-08-22
  • 2021-07-07
  • 2017-06-29
相关资源
最近更新 更多