【问题标题】:firestore -- Add element in a field in hashmapfirestore -- 在 hashmap 的字段中添加元素
【发布时间】:2020-01-06 11:12:11
【问题描述】:

以上是集合“网络”的结构。想要做的是在“用户”字段中添加另一个元素。这是HashMap。我要实现的是 Key= xyz@gmail.com 及其值 {displayName: "Anirudh Kumar", "role":"admin"}。

xyz@gmail.com 显示名称:“阿尼鲁德·库马尔” 角色:“管理员”

我尝试了几件事,但似乎没有用。

第一个选项

        Map<String, Network.NetworkUser> users = new HashMap<>();
        users.put(email, networkUser);

       db.collection("networks").document("id")
          .update("users",FieldValue.arrayUnion(users));

第二个选项

       db.collection("networks").document(userNetwork.getNetworkUid())
                                .set(users,SetOptions.merge());

第三个选项

                            db.collection("networks").document(userNetwork.getNetworkUid())
                                .update("users."+email,networkUser);

第三个选项让我更接近答案,但由于电子邮件中的点 [.] 它会创建另一行,请告诉我是否可以通过某种方式避免这种情况。

如果有人可以帮助我如何实现预期的目标,将不胜感激。谢谢。

【问题讨论】:

  • 您可能需要编辑帖子中显示的电子邮件地址。
  • 没关系@TeymourAldridge..
  • @TeymourAldridge 但是考虑到他用于 StackOverflow 的用户名,OP 的电子邮件地址很容易猜到。
  • 我只是在检查以确保它没有被意外包含错误。
  • 感谢您对@TeymourAldridge 的关注。您能帮我解决问题吗?

标签: java android firebase google-cloud-firestore


【解决方案1】:

您的尝试均无效,因为您尝试使用 Map 更新文档,其中值是 Network.NetworkUser 类型的对象,这是不可能的,因为您无法将该对象映射到HashMap

users 属性是什么?实际上,是Map 类型的属性,它包含其他HashMap。所以你需要先获取文档,获取users 属性的值,转换为Map&lt;String, Object&gt; 并放入另一个HashMap。这个新的 HashMap 包含一个对象,其中电子邮件地址作为键,另一个 HashMap 作为值,它再次包含两个具有两个值的键。将所需数据添加到地图后,只需将文档写回即可。

如果您不希望这种行为,您可以简单地在每个 (Network.NetworkUser) 文档下创建一个用户子集合。

【讨论】:

  • 嗨,Alex,我没有明白你的意思,“获取 users 属性的值,转换为 Map 并放入另一个 HashMap”。你的意思是我应该参考 users 属性?
  • db.collection("networks").document(userNetwork.getNetworkUid()).get() 你的意思是这样的吗?我的怀疑可能听起来有点傻,因为我是 Firestore 的新手,所以如果你能帮助我摆脱它,我将不胜感激。
  • 另外,如果您查看选项 3,我尝试过,因为点 [.] 我无法解决我的问题。否则,这是一个可行的解决方案。
  • 是的,您首先使用db.collection("networks").document(userNetwork.getNetworkUid()).get() 获取文档,附加一个侦听器并获取users 属性的值。因为您将该值转换为Map&lt;String, Object&gt;,您可以添加另一个具有我的答案中解释的结构的 HashMap。
  • 解决方案三也行不通,因为您使用的是Network.NetworkUser 对象,最后,不要忘记将文档写回。就是这样。
【解决方案2】:

这可能对其他人有用,正如 Alex 在上一篇文章中所说,问题正在发生,因为 Firestore 不知道对象“NetworkUser”。所以处理This的一种方法是将Json String中的对象转换如下:

1.- 在插入之前,新建一个Hashmap

2.- 遍历旧的 Hashmap,并使用 Gson(或其他)做:

        val gson = Gson()
        for ((key, user) in my_old_hashmap) {
            val user  = gson.toJson(user)
            my_new_hashmap[key] = user
        }

3.- 在插入任何结构时继续插入 Firestore。

4.- 然后使用 gson 再次读取此转换为“您的结构”:

for ((key, user_string) in my_new_hashmap) {
      val user  = gson.fromJson(user_string, My_Object_Any::class.java)
       my_old_hashMap[key] = user
        }

TL;DR:Firestore 不知道您的结构,因此要插入的 HashMap 可以是 或 Firestore 支持的任何其他原始对象。

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多