Javascript 使用Node.js从firebase获取特定的键值对
我的firebase数据库中有1000多个产品文档。为了在前端显示产品列表,我只需要获得每个文档的几个关键值。是否可以在firebase中使用Node.js执行此操作。下面是我的文件结构Javascript 使用Node.js从firebase获取特定的键值对,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我的firebase数据库中有1000多个产品文档。为了在前端显示产品列表,我只需要获得每个文档的几个关键值。是否可以在firebase中使用Node.js执行此操作。下面是我的文件结构 { "name":"Prod 1", "color" : "red", "price" : 1234, "sku" : 156986325, "stock" : 20 }, { "name":"Prod 2", "color" : "black", "price" : 1236
{
"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
}
在这个文件中,我只需要名称,价格和股票的详细信息作为回应。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
},
...
},
...
}
{
"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
}
}
}
Firebase实时数据库无法执行类似SQL的SELECT语句。您将获得请求密钥的所有数据。因此,我会将数据拆分为单独的树。像这样:
{
"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
},
...
},
...
}
{
"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
}
}
}
示例代码
这意味着您可以查询产品列表,然后在项目详细信息页面上获取有关产品的更多信息。因为一个人不需要你的整个产品数据库,所以对你的数据进行分页
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
});
注意:在startAtv中,v不是索引,而是键名。因此,要获得下一页的项目,v将是上一页最后一个项目的SKU加1
如果您打算做高级搜索,例如所有的产品都是红色的,也低于100美元,考虑迁移,因为它能够同时过滤多个属性上的数据。这很有帮助。我们在CloudFireStore中有类似SQL的SELECT语句吗?不幸的是没有。在CloudFireStore中,所有内容都包含在类似于浅层对象的文档中。它们可以引用其他文档,但当您只需要文档的信息而不需要其子文档的信息时,不必下载它们。我建议您查看更多信息。