数据结构
首先,当您使用 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,因为它能够同时过滤多个属性的数据。