首页 > 解决方案 > 如何更新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的食谱。

标签: javascriptfirebasefirebase-realtime-database

解决方案


检查这个讨论,这很有趣。这是关于mongodb的,但由于它们都是noSQL,所以这些想法仍然有效。好读。

不幸的是,实时数据库在查询和过滤方面并不是特别好,afaik,这甚至是不可能的。Firestore 会更好。

您在这里唯一的选择是查询所有食谱,用“梨”过滤这些食谱并更新颜色。然后在数据库中再次更新文档


推荐阅读