【问题标题】:Unity - Storing Multiple Data of Same Fields to Same Document ID in FirestoreUnity - 将相同字段的多个数据存储到 Firestore 中的相同文档 ID
【发布时间】:2020-08-10 22:55:22
【问题描述】:

如何将数据添加到 Firestore 而不会覆盖相同键的先前数据?例如,我想将一个名为“Player 1”的文档添加到“Scores”集合中。我想跟踪玩家 1 的所有分数,无论同一玩家玩了多少次游戏。换句话说,如何将数据附加到 Firestore 文档?

这是我将数据写入 Firestore 的代码。如何确保每次为同一用户运行此代码时都不会覆盖“数据”?对于如何实现这一点的任何帮助将不胜感激:

public void LogGameStats()
{

    var data = new Dictionary<string, object>{
      {"Number of Targets Collected", gameStats.targetCollectedCount},
      {"Number of Walls Hit", gameStats.wallHitCount},
      {"Number of Hazards Hit", gameStats.hazardHitCount},

      };

      StartCoroutine(WriteDoc(GetDocumentReference(), data));
      Debug.Log("I logged something");
}

【问题讨论】:

  • 请附上你的firebase相关代码

标签: c# firebase unity3d google-cloud-firestore


【解决方案1】:

如果您使用相同的 documentID,您可以使用 2 种方法来实现这一点,而这两种方法都需要对您的 Firestore 结构进行一些重组:

  1. 使用分数数组:

使用这种方法,您可以在每次用户获得新分数时将记录添加到分数数组中,并且最新分数将是数组中的最后一条记录。为此,您必须具有以下 Firestore 结构:

Player Collection
    playerId,
    [
        {
            targetCollectedCount,
            wallHitCount,
            hazardHitCount
        },
        {...}
    ]

这种方法的问题在于,随着游戏的进行,您将不得不在该数组中保存许多记录,并且每次阅读此文档时都需要获取所有记录,这可能会导致您的游戏表现不佳,而且还有每个文档的文档大小限制为 1MB,这可能会很快被打破,所以我不推荐这种方法,但它仍然是一种选择。

  1. 有一个分数子集合:

使用这种方法,您将在每次用户获得新分数时创建一个新的分数文档,您还可以添加时间戳以便更轻松地获得最新分数。为此,您必须具有以下 Firestore 结构:

Player Collection
    playerId,
    Score Subcollection
        scoreId,
        targetCollectedCount,
        wallHitCount,
        hazardHitCount,
        scoreTimestamp

使用这种方法,您可以更灵活地一次获取多少分数,从而获得更好的性能,此外,您可以在一个集合中存储的文档数量没有限制,因此您不必担心文件大小。

注意:我没有分享任何代码,因为我认为这更像是 Firestore 问题的结构而不是编码问题,但是如果您在实现执行此任务的代码时遇到任何问题,请告诉我我可以帮你。

【讨论】:

  • 你太棒了。谢谢你。我最终针对不同类型的数据执行了上述两个选项。
  • @CaseyK 很高兴知道我的回答很有帮助,请考虑投票并接受它,这样,如果社区中的其他人遇到了与您相同的问题,他们就会知道我的回答是正确并且会更容易地引用它,而且它将有助于提高您在 Stack Overflow 上的声誉。 :)
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 2012-03-26
  • 2021-08-14
  • 2019-06-25
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多