Javascript 按内部数组值进行Firebase查询

Javascript 按内部数组值进行Firebase查询,javascript,typescript,firebase,ionic-framework,firebase-realtime-database,Javascript,Typescript,Firebase,Ionic Framework,Firebase Realtime Database,通过在我的应用程序中从下拉列表中选择一个值,我需要获得在其内部节点“foodtype”中包含所选值的每个对象的列表 我的Firebase数据库具有以下结构: restaurants - key: "12345" - name: "Salad house" - address: "Etc etc etc" - foodtypes - 0: "Salad" - 1: "Fastfood" - 2: "Seafood" ...

通过在我的应用程序中从下拉列表中选择一个值,我需要获得在其内部节点“foodtype”中包含所选值的每个对象的列表

我的Firebase数据库具有以下结构:

restaurants
  - key: "12345"
    - name: "Salad house"
    - address: "Etc etc etc"
    - foodtypes
        - 0: "Salad"
        - 1: "Fastfood"
        - 2: "Seafood"
...
例如:如果我选择沙拉、快餐或海鲜,我应该在我的餐厅列表中找到上面的对象。但是,如果我选择日本食物,我应该不会得到任何或任何其他记录,其中包含


有没有一种方法可以在Firebase中做到这一点,而不创建大量串联字段/值?如果有任何建议,我将不胜感激

这可以通过云Firestore查询实现,而不是Firebase RTDBRealtime数据库查询

如果您想使用Firebase RTDB来处理它,您的数据库应该如下所示

restaurants
  - key: "12345"
    - name: "Salad house"
    - address: "Etc etc etc"
    - foodtype: 0 (or 1 or 2 ...)
...
您也可以使用诸如沙拉、快餐、海鲜之类的字符串,但由于名称将来可能会更改,我将使用integer作为常量变量,并在javascript代码中将其定义为const FOODTYPE_sala=0,const FOODTYPE_Fastfood=1

最后您可以得到如下代码的列表

return restaurantsRef.orderByChild('foodtype').equalTo(FOODTYPE_SALAD).once('value').then(snap => {
    // TODO: ...
});
但这种方式有一些缺点

例如,不能根据需要对列表进行排序。如果您想将餐厅列表排序为注册日期,该怎么办

因此,在这种情况下,Firebase RTDB的最佳选择是对数据库进行非规范化并使数据库平坦化

你将需要

这是数据库表的最终外观

restaurants
  - key: "12345"
    - name: "Salad house"
    - address: "Etc etc etc"
    - foodtype: 0
  - key: "22222"
    - name: "Fastfood house"
    - address: "Etc etc etc"
    - foodtype: 1
  - key: "33333"
    - name: "Seafood house"
    - address: "Etc etc etc"
    - foodtype: 2

restaurants-salad
  - key: "12345"
    - name: "Salad house"
    - address: "Etc etc etc"
    - foodtype: 0

restaurants-fastfood
  - key: "22222"
    - name: "Fastfood house"
    - address: "Etc etc etc"
    - foodtype: 1

restaurants-seafood
  - key: "33333"
    - name: "Seafood house"
    - address: "Etc etc etc"
    - foodtype: 2
...

请记住,餐厅应具有所有原始餐厅对象数据

如果选择“沙拉”,则要获取食物类型?如果选择“沙拉”,则要获取整个餐厅对象,因为它的“食物类型”内部节点中包含该值。我不确定这是否可行,但是如果你删除了foodtypes,只添加了-0:salar-1:Fastfood-2:seaft,那么我就有可能像你说的那样删除foodtypes节点,并创建3个名为foodtype1、foodtype2、foodtype3的字段,但通过这样做,我将为每家餐厅设置一个允许的固定数量的食物类型。我真的很难接受这种非规范化水平。我已经使用关系数据库很多年了,但我认为我必须这样做。@Marcelo记住,非规范化在NoSQL数据库中是正常的,它比rdb的性能更好。请检查以下内容:如果我的回答对您有帮助,您必须感谢我的回答: