【问题标题】:get specific key-value pairs from firebase using Node.js [closed]使用 Node.js 从 firebase 获取特定的键值对 [关闭]
【发布时间】:2019-03-16 05:35:17
【问题描述】:

我的 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有这个功能吗?如果是这样,那么您能否帮助我了解查询结构。

提前致谢

【问题讨论】:

    标签: javascript node.js firebase firebase-realtime-database


    【解决方案1】:

    数据结构

    首先,当您使用 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
      });
    

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

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

    【讨论】:

    • 谢谢。这很有帮助。 Cloud Firestore 中有类似 SQL 的 SELECT 语句吗?
    • 很遗憾没有。在 Cloud Firestore 中,所有内容都包含在类似于浅对象的“文档”中。它们可以引用其他文档,但当您只需要文档而不是子文档的信息时,不必下载它们。我建议查看Firecasts on Firestore 了解更多信息。
    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多