使用Node.js从Firebase获取特定的键值对

时间:2019-03-16 05:35:18

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

我的Firebase数据库中有1000份产品文档。为了在前端显示产品列表,我只需要获取每个文档的几个键值。是否可以在Firebase中使用Node.js做到这一点。下面是我的文档结构。

  [aaaaaaa],[aaa],...

在本文档中,我仅需要{ "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"的详细信息作为回复。 firebase是否具有此功能?如果是这样,那么您能帮我查询结构吗?

预先感谢

1 个答案:

答案 0 :(得分: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,因为它能够一次过滤多个属性上的数据。