javascript - 如何更新firebase实时数据库中的非规范化数据
问题描述
我正在创建一个食谱应用程序,只是为了学习 Vue 和 Firebase 实时数据库。
这是配方结构:
{
"name": "Stackoverflow shake",
"description": "",
"ingredients": {
"-MLikewQrETdTWM12NVY": {
"color": "red",
"name": "Strawberries"
},
"-MLilh_HCnqX7Op7QmZ9": {
"color": "purple",
"name": "Pear"
}
}
}
这是成分结构:
{
"name": "Pear",
"color": "purple"
}
我创建或更新配方没有问题,但是当我更新一种成分时,只是改变它的颜色,我很难更新所有特别包含该成分的配方。
假设我将梨的成分更新为颜色:“绿色”。菜谱Stackoverflow shake
上仍然显示梨紫。
我想我必须迭代所有包含Pear的食谱,并更新颜色,但我无法过滤它们。
我尝试了什么:
updateIngredient({state}, payload) {
// THIS WORKS
db.ref("ingredients/" + payload.content.id)
.update(payload.content).then((test) => {
console.log(test);
});
// THIS DOESN'T WORK (doesn't filter only the recipes that contain that ingredient
let query = db.ref('recipes').orderByChild(
'ingredients/' + payload.content.id);
query.once('value', function (snapshot) {
snapshot.forEach(function (recipeSnapshot) {
console.log(recipeSnapshot);
db.ref('recipes/' + recipeSnapshot.key + '/ingredients/'
+ payload.content.id).update(payload.content);
})
});
},
该方法的第二部分只是将Pear成分添加到所有食谱中,它不会将食谱过滤为仅具有Pear的食谱。
解决方案
检查这个讨论,这很有趣。这是关于mongodb的,但由于它们都是noSQL,所以这些想法仍然有效。好读。
不幸的是,实时数据库在查询和过滤方面并不是特别好,afaik,这甚至是不可能的。Firestore 会更好。
您在这里唯一的选择是查询所有食谱,用“梨”过滤这些食谱并更新颜色。然后在数据库中再次更新文档
推荐阅读
- r - Left_join 条件下
- firebase - firebase 函数 url 重写破坏 cookie
- php - 向 Symfony 动态添加规范化器
- google-cloud-platform - 谷歌云,哪个存储更好,key/value
- r - 根据 R 中的查找表添加新列
- c++ - C++:使用 std::uint_fastn_t 的缺点
- sql-server - 设计具有特定障碍的亲子关系结构的最佳方法
- javascript - http://localhost:8000/ 不会加载 App.js 中的新更改
- angular - Angular 2 Wijmo Flex 图表系列
- internet-explorer - window.focus() 没有将焦点保持在窗口上