Javascript Firebase实时数据库,仅在&;日期不到';不存在

Javascript Firebase实时数据库,仅在&;日期不到';不存在,javascript,reactjs,firebase,firebase-realtime-database,Javascript,Reactjs,Firebase,Firebase Realtime Database,我做了大量的研究,阅读了firebase上的多个stackoverflow问题。有些是有帮助的。但没有一件事对我的问题特别有帮助。我想做一个菜单规划。例如,我需要不止一次的检查来测试。日期存在,服务类型为===至“午餐”| |“晚餐” 我有一个功能,添加和图像保存url和输入数据的状态在反应。然后我使用,useffect监听状态更新并将数据发送到firebase。我只想在以下情况下向firebase发送新数据 所有检查都通过了,但它们不存在。另一方面,我想更新我的数据。我试过了。Foreach,

我做了大量的研究,阅读了firebase上的多个stackoverflow问题。有些是有帮助的。但没有一件事对我的问题特别有帮助。我想做一个菜单规划。例如,我需要不止一次的检查来测试。日期存在,服务类型为===至“午餐”| |“晚餐”

我有一个功能,添加和图像保存url和输入数据的状态在反应。然后我使用,useffect监听状态更新并将数据发送到firebase。我只想在以下情况下向firebase发送新数据 所有检查都通过了,但它们不存在。另一方面,我想更新我的数据。我试过了。Foreach,for in,ref('link/'+localState.id)。许多不同的方法,我似乎没有得到正确的

这是表单提交功能:

const handleSubmit = (e) => {
    e.preventDefault();

    if (image) {
      const uploadTask = storage.ref(`images/${image.name}`).put(image);

      uploadTask.on(
        "state_changed",
        (snapshot) => {
          const progress = Math.round(
            (snapshot.bytesTransferred / snapshot.totalBytes) * 100
          );

          setProgress(progress);
        },
        (error) => {
          setError(error);
        },
        () => {
          storage
            .ref("images")
            .child(image.name)
            .getDownloadURL()
            .then((url) => {
              const value = state.serviceType;
              const keys = Object.keys(value);
              var filtered = keys.filter(function (key) {
                return value[key];
              });

/////////I have also tried this method, to use one function for all instead of using useEffect//////

              const mealData = db().ref().child("meals");
              const newMealdata = mealData.push();
              //  newMealdata.set({
              //    serviceId: newMealdata.key,
              //    date: props.dates,
              //    serviceType: filtered,
              //    service: {
              //      mealService: state,
              //      image: url,
              //    },
              //  });
///////////////////////////////////////////////

              setNewState((prev) => {
                return {
                  ...newState,
                  date: props.dates,
                  serviceType: filtered,
                  serviceId: newMealdata.key,
                  service: state,
                };
              });

              setProgress(0);
            });
        }
      );
    } else {
      setError("Error Please Choose an Image to Upload");
    }
  };
效用函数

 useEffect(() => {
    console.log("newState mounterd: ", newState);
    db()
      .ref("meals/" + newState.serviceId)
      .set({ newState });
  }, [newState]);
我已经尝试使用state.id检查它是否等于snapshot.key,尽管它们确实进行了检查。firebase仍然使用相同的日期创建一个新的数据节点,但使用不同的ID和我想要更新的数据

那么,最好怎么说:

if(snapshot.val().date === props.dates && snapshot.val().serviceId === snapshot.key && servicetype === "lunch" || 'dinner'){
update({with new inserted data})
}else if(data doesn't match){
ref('meals').set({createNewNode})
}

Firebase数据库实现了相当有限的查询支持。要扩展此功能,您通常必须:

  • 展开/修改数据模型以允许进行所需的查询
  • 在客户端代码或其他系统(如专用全文搜索引擎)中执行部分筛选
  • 无法在实时数据库的查询中实现您的条件,因为:

    • 每个查询只支持一个条件
    • 它不支持或不支持任何条件
    有时,您可以通过向数据中添加合成属性,例如
    “dates\u serviceId”:“…..”
    ,将多个AND条件组合到一个查询中。有了这样一个属性,您就可以查询
    ref.orderBy(“dates\u serviceId”).equalTo(“myDate\u myServiceId”)

    为了能够查询提供午餐或晚餐服务的节点,您必须扩展数据模型以明确标识此类节点,例如,通过向它们添加
    “午餐或晚餐”:true
    属性。有了这样一个节点,您就可以查询:
    ref.orderBy(“午餐”或“晚餐”).equalTo(true)


    通过结合这两种方法,您甚至可以为整个查询创建一个属性(
    dates\u serviceId\u午餐或晚餐
    ),尽管我必须承认,这对我的口味来说已经有点过于具体了。

    在本地这样做,我觉得“这不是最佳做法”。我曾经做过类似的工作,但我不记得我是怎么做的。但这有点像将获取的数据保存到一个状态。然后把那个州和我的本地州进行比较。但不是使用push方法来获取随机密钥。我通过添加日期+服务类型创建了密钥。所以在firebase,每个新来的孩子都有类似的东西。20年10月29日午餐:{}或20年10月29日晚餐:{}。我设法用这种方式编辑了孩子们,但我使用的是firebase的axios。我也不确定这样做是否明智。