【问题标题】:How to reconcile array creation with array appending?如何协调数组创建与数组附加?
【发布时间】:2020-10-11 02:45:33
【问题描述】:

在我的代码中,我正在实时数据库中创建一个节点,如下所示:

const ref = await lobbyGamesRef.push({
  players: [{ uid: context.auth.uid }],
  // other properties omitted, but there's like 6 in all
});

这是一个数组,因为主机刚刚创建了一个游戏,因此目前是其中唯一的人。

当另一个玩家加入时,我正在运行这段代码:

await db.ref(`/lobbyGames/${data.gameKey}/players`).push({
  uid: context.auth.uid
});

结果,正如熟悉实时数据库的人所预测的那样:

数组最初是用数字索引创建的,然后push 为下一件事创建一个 id,而不是继续索引。

我在this question 看到推荐使用childByAutoId,但是在阅读了上面的reference 之后,我真的看不出它会在这里如何使用。

理想情况下,我希望拥有所有数字或所有 uuid 键,idk。我只想要一致性!而且我宁愿不必为了写入而读取属性,这不是太有效。

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    如果你想使用 push,你必须始终如一地使用它。您将无法传递一个数组来最初填充孩子。例如,您可能想要这样做:

    const ref = await lobbyGamesRef.push().child("players").push({
      uid: context.auth.uid
    });
    

    【讨论】:

    • 抱歉,我可能会误解你,但 push 返回一个 ThenableReference does not have ref 方法,只有一个 ref 属性——我想我误解了。我认为child 会起作用......?也许吧~现在就试试吧~
    • 我更新为使用 child() 来构建由 push() 创建的引用。
    【解决方案2】:

    正如 Firebase 实时数据库所指定的,每当您将新项目推送到数组中时,它都会自动生成一个唯一 ID

    在您的情况下,当您第一次初始化时,您的 Ref 指向特定游戏,稍后,当您添加新玩家时,您的 Ref 指向特定游戏的玩家数组。我建议当您第一次添加游戏时,只需使用空数组初始化您的玩家并在单独的函数中调用 push()

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2023-03-16
      • 2021-03-30
      • 1970-01-01
      • 2012-08-23
      • 2021-12-29
      • 1970-01-01
      • 2017-05-22
      相关资源
      最近更新 更多