javascript - Firebase 按内部数组值查询

标签 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"
...

例如:如果我选择“沙拉”、“快餐”或“海鲜”,我应该在我的餐厅列表中获得上面的对象。但如果我选择“日本菜”,我应该不会得到任何结果(或包含该内容的任何其他记录)。

有没有办法在 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 = 0const 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/

相关文章:

javascript - IE 和 DOM 标准模型

javascript - 从 Cloud Firestore 在 MatDatepicker 中加载时间戳 |火力地堡

angular - 更改检测似乎在动态实例化的组件中不起作用

javascript - Firebase 函数将日期时间存储为 map

java - 如何在回收站 View 中只获取我想要的项目

javascript - Ruby on Rails ExecJS::Pages 中的运行时错误#home

javascript - 使用 Ajax 弹出窗口进行基本身份验证登录?

javascript - 为什么异步函数比同步函数需要更多时间来执行?

node.js - 如何在不同的文件中拆分 Bot Framework 对话框

android - 数据库引用 vs Firebase数据库