如何在firebase

时间:2018-04-10 21:32:37

标签: javascript reactjs firebase firebase-realtime-database

我的firebase上保存了一个数组,如下所示:

matches:[ {match:{id:1,data:...}}]

我想在此阵列的firebase上只保存一个项目。例如,我的匹配有id:32。我想在firebase中保存的数组中找到它,然后更改它。

我试图做到这一点。但我认为这是非常难以向firebase发出请求,复制数组,并再次保存整个数组。

const ref = `/users/${currentUser.uid}/matches`;
      var list = [];
       firebase.database().ref(ref).on('value',  function (snap) { list = snap.val(); });

  if (list.length > 0) {
    const indexToUpdate = list.findIndex(k => k.name == match.name)
    if (indexToUpdate >= 0) {
      list[indexToUpdate] = match;

      return dispatch => {

         firebase
          .database()
          .ref(`/users/${currentUser.uid}/matches`)
          .set(list)
          .then(() => {
            dispatch({ type: MATCH_UPDATE, payload: match });
          });

      };
    }
  }

有光吗?

enter image description here

3 个答案:

答案 0 :(得分:2)

这行代码:

const indexToUpdate = list.findIndex(k => k.name == match.name)

您的数据结构不理想是一个死的赠品。

考虑将匹配项存储在其名称下,并在其前面添加一个字符串,以防止Kenneth提到的数组强制。所以:

matches
  match1
    date: "2018-06-14..."
    ...
  match2
    date: "2018-06-16..."
    ...

使用此功能,您可以在不需要查询的情况下查找节点以进行匹配。它还可以防止使用数组,这是Firebase中的反模式,正是因为你提到的原因。

有关详情,请参阅Best Practices: Arrays in Firebase上的经典Firebase博客文章。

答案 1 :(得分:1)

Firebase将数组存储为对象,并在返回到客户端时将其转换回数组,如果按字符数字正确排序

但基本上它应该能够在你想要更新的对象的路径上工作。

firebase
  .database()
  .ref(`/users/${currentUser.uid}/matches/${indexToUpdate}`)
  .set(match)
  .then(() => {
    dispatch({ type: MATCH_UPDATE, payload: match });
  });

答案 2 :(得分:0)

您需要在网址

中引用您尝试按ID设置的项目的ID
     firebase
      .database()
      .ref(`/users/${currentUser.uid}/matches/32`)
      .set(list)
      .then(() => {
        dispatch({ type: MATCH_UPDATE, payload: match });
      });

另外,如果索引不起作用,请使用snap.key获取所需的ID。