在 Firebase 中,您可以使用单个值或值范围进行查询,因此构建单个查询来获取与多个关键字匹配的项目是不可能的。但是,您可以安排数据库,以便可以轻松查询单个关键字。然后您需要组合多个查询等。
您可以这样安排您的数据:
{
"items": {
"item1_id": {
"brand_id": ...,
"itemName": ...,
"price": ...,
"keywords": {
"black": true,
"t-shirt": true
}
}
}
}
但是,正如中所解释的这个答案,您需要为每个关键字定义一个索引。为了实现基于关键字的高效查询,您可以创建自己的关键字到项目的映射:
{
"items": {
"item1_id": {
"brand_id": ...,
"itemName": ...,
"price": ...,
"keywords": {
"black": true,
"t-shirt": true
}
}
},
"keywords": {
"black": {
"item1_id": true
},
"t-shirt": {
"item1_id": true
}
}
}
关键字的查询将如下所示:
let keyword = "black";
database.ref(`keywords/${keyword}`).once("value", (snapshot) => {
snapshot.forEach((idSnapshot) => {
database.ref(`items/${idSnapshot.key}`).once("value", (itemSnapshot) => {
console.log(JSON.stringify(itemSnapshot.val()));
});
});
});
必须维护自己的关键字到项目的映射有点痛苦,但查询会很快。此外,Firebase 的多位置更新可以使维护关键字映射变得更加容易。要创建一个项目:
database.ref().update({
"items/item1_id": {
"brand_id": ...,
"itemName": ...,
"price": ...,
"keywords": {
"black": true,
"t-shirt": true
}
},
"keywords/black/item1_id": true,
"keywords/t-shirt/item1_id": true
});
更改项目的关键字(删除black
, add blue
然后离开t-shirt
未触及):
database.ref().update({
"items/item1_id/keywords": {
"black": null,
"blue": true
},
"keywords/black/item1_id": null,
"keywords/blue/item1_id": true
});
并删除一个项目:
database.ref().update({
"items/item1_id": null,
"keywords/blue/item1_id": null,
"keywords/t-shirt/item1_id": null
});