Firebase构造和过滤密钥上的多个属性(值)

时间:2016-10-18 13:33:43

标签: firebase firebase-realtime-database

我正在构建一个解决方案,我需要在我的产品上添加颜色,类型等属性。产品将能够有多种颜色。

所以我的问题是,我应该将我的数据属性构建为firebase或对象中的数组,还是有其他方式?

我想用.eQualTo过滤我的产品(或者如果有更好的方法) https://firebase.google.com/docs/reference/js/firebase.database.Query#equalTo

示例1)

{
name: "My red n' white product",
color: ["white", "red"]
}

示例2)

{
name: "My red n' white product",
color: {red: true, white: true}
},
{
name: "My blue product",
color: {blue : true}
}

例3)?

1 个答案:

答案 0 :(得分:2)

这里要实现的一些事情:

  • 每当您觉得需要存储数组,但是想要对其执行contains()操作时:您可能希望存储一个集合。有关详情,请参阅我之前的回答:Setting arrays in Firebase using Firebase console

  • 即使将颜色存储为一组,您最终也会得到如下问题:ref.orderByChild('color/blue').equalTo(true)。虽然此查询有效,但它要求您为['color/blue', 'color/red', 'color/white']定义索引。只要您的类别/颜色是动态的,这就不可能实现,因为您无法以编程方式添加索引。

对此数据建模的更惯用的方法是遵循用例"。您想获得特定类别/颜色的项目列表。因此,在这种情况下,请存储每种颜色的项目列表:

itemsByColor: {
  red: {
    keyOfRedAndWhiteProduct: true
  },
  white: {
    keyOfRedAndWhiteProduct: true
  },
  blue: {
    keyOfBlueProduct: true
  }
}

现在,您可以轻松查找项目键列表,然后加载它们。

我强烈建议您还阅读Firebase guide on structuring data,特别是modeling data that scales部分。对于任何向NoSQL数据库过渡的人来说,NoSQL data modeling上的这篇文章是必读的。