首页 > 解决方案 > 使用 Node.js 从 firebase 获取特定的键值对

问题描述

我的 Firebase 数据库中有 1000 多个产品文档。要在前端显示产品列表,我只需要获取每个文档的几个键值。是否可以使用 Node.js 在 Firebase 中进行操作。以下是我的文档的结构。

{
  "name":"Prod 1",
  "color" : "red",
  "price" : 1234,
  "sku"  : 156986325,
  "stock" : 20
},
{
  "name":"Prod 2",
  "color" : "black",
  "price" : 1236,
  "sku"  : 896532,
  "stock" : 10
},
{
  "name":"Prod 3",
  "color" : "green",
  "price" : 129,
  "sku"  : 8965324546,
  "stock" : 16
}

在本文档中,我只需要"name","price""stock"详细信息作为响应。firebase有这个功能吗?如果是这样,那么你能帮我处理查询结构吗?

提前致谢

标签: javascriptnode.jsfirebasefirebase-realtime-database

解决方案


数据结构

首先,当您使用 Firebase 实时数据库时,我将重组您的数据库以不使用数组。使用数组会减慢查询速度,并且比为每个产品分配 ID 更慢。在您的数据中,您将使用 SKU 作为每个产品的 ID。像这样:

{
  "products": {
    "156986325": {
      "name": "Prod 1",
      "color": "red",
      "price": 1234,
      "stock": 20
    },
    "896532": {
      "name": "Prod 2",
      "color": "black",
      "price": 1236,
      "stock": 10
    },
    "8965324546": {
      "name": "Prod 3",
      "color": "green",
      "price": 129,
      "stock": 16
    },
    ...
  },
  ...
}

Firebase 实时数据库无法执行类似 SQL 的 SELECT 语句。您将获得所请求密钥的所有数据。因此,我会将数据拆分为单独的树。像这样:

{
  "productDetail": {
    "156986325": {
      "name": "Prod 1",
      "color": "red",
      "price": 1234
    },
    "896532": {
      "name":"Prod 2",
      "color" : "black",
      "price" : 1236
    },
    "8965324546": {
      "name":"Prod 3",
      "color" : "green",
      "price" : 129
    }
  },
  "productOrdering": {
    "156986325": {
      "supplier": "...",
      "cost": 549,
      "backorders": 0,
      "stock": 20
    },
    "896532": {
      "supplier": "...",
      "cost": 480,
      "backorders": 0,
      "stock": 10
    },
    "8965324546": {
      "supplier": "...",
      "cost": 99,
      "backorders": 0,
      "stock": 16
    }
  }
}

示例代码

const admin = require("firebase-admin");

这意味着您可以查询您的产品列表,然后在项目详细信息页面上,获取有关该产品的更多信息。因为人类不会一次需要您的整个产品数据库,所以对您的数据进行分页。

admin.database().ref("productDetail").limitToFirst(20).startAt(0).once("value")
  .then((snapshot) => {
    snapshot.forEach((productSnapshot) => {
      let sku = productSnapshot.key;
      let data = productSnapshot.val();

      // TODO: Do something with product data
    });
  })
  .catch((error) => {
    // TODO: Log/report error
  });

要查找给定 SKU 的详细信息,请使用:

admin.database().ref("productDetail").child(sku).once("value")
  .then((productSnapshot) => {
    if (!productSnapshot.exists()) {
      // TODO: Handle unknown SKU
    }

    let data = productSnapshot.val();
    // TODO: Do something with data
  })
  .catch((error) => {
    // TODO: Log/report error
  });

注意: In startAt(v),v不是索引,而是键名。因此,要获得下一页的商品,v将是上一页最后一项的 SKU 加 1。

如果您打算进行“高级”搜索(例如所有红色且价格低于 100 美元的产品),请考虑迁移到Cloud Firestore,因为它能够同时过滤多个属性的数据。


推荐阅读