通过从应用程序的下拉列表中选择一个值,我需要获取在其内部节点“foodtype”中包含所选值的每个对象的列表。
我的 Firebase 数据库中有以下结构:
restaurants
- key: "12345"
- name: "Salad house"
- address: "Etc etc etc"
- foodtypes
- 0: "Salad"
- 1: "Fastfood"
- 2: "Seafood"
...
例如:如果我选择“沙拉”、“快餐”或“海鲜”,我应该在我的餐厅列表中获得上面的对象。但如果我选择“日本菜”,我应该不会得到任何结果(或包含该内容的任何其他记录)。
有没有办法在 Firebase 中执行此操作,而无需创建大量串联字段/值?我真的很感激任何建议!
最佳答案
这可以通过 Cloud Firestore 查询实现,而不是 Firebase RTDB(实时数据库)查询。
如果您想使用 Firebase RTDB 来处理它,您的数据库应该如下所示。
restaurants
- key: "12345"
- name: "Salad house"
- address: "Etc etc etc"
- foodtype: 0 (or 1 or 2 ...)
...
您还可以使用“Salad”、“Fastfood”、“Seafood”等字符串,但由于名称将来可能会更改,我将使用整数作为常量变量,并在您的 javascript 代码中将其定义为 const FOODTYPE_SALAD = 0
,const FOODTYPE_FASTFOOD = 1
。
最后你可以得到如下代码的列表。
return restaurantsRef.orderByChild('foodtype').equalTo(FOODTYPE_SALAD).once('value').then(snap => {
// TODO: ...
});
但是这种方式有一些缺点。
例如,您无法根据需要对列表进行排序。如果您想按注册日期对餐厅列表进行排序怎么办?
因此,在这种情况下,Firebase RTDB 的最佳选择是对数据库进行非规范化并扁平化数据库。
您将需要Server side Fan-out on Cloud Functions for Firebase .
这是数据库表的最终外观。
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
...
请记住,restaurants
应具有所有原始restaurant
对象数据。
关于javascript - Firebase 按内部数组值查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49223192/