javascript - 使用 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有这个功能吗?如果是这样,那么你能帮我处理查询结构吗?
提前致谢
解决方案
数据结构
首先,当您使用 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,因为它能够同时过滤多个属性的数据。
推荐阅读
- python - 在 Python 中,如何使用 tkinter 限制打开窗口或按下按钮
- javascript - Angular9:在组件中找不到服务的导入
- codeception - Codeception:强制 PhpBrowser 使用自定义环境
- python - 删除未使用的 python 版本 macos Catalina
- python - 将PDF表格数据转换为csv,现在如何将其存储到数据库中?
- azure - HTTP状态未经授权
- python - 如何通过 AWS Lambda 使用 pysftp 连接 EC2,无需 .pem 文件或替代 .pem 文件
- css - 应用栏下方的内容在材质 ui 中没有缩小
- python - Python:如何标记图的节点
- tensorflow - 我的带有 multi_gpu_model 的 Keras 网络仅使用 1 个 GPU