[英]firestore -- Add element in a field in hashmap
以上是集合“网络”的结构。 想要做的是在“用户”字段中添加另一个元素。 这是一个HashMap
。 我想要实现的是 Key= xyz@gmail.com 及其值 {displayName: "Anirudh Kumar", "role":"admin"}。
xyz@gmail.com displayName: "Anirudh Kumar" 角色: "admin"
我尝试了几件事,但似乎不起作用。
第一个选项
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);
第三个选项让我更接近回答,但由于电子邮件中的点 [.] 会创建另一行,请告诉我是否可以避免这种情况。
如果有人可以帮助我如何实现预期目标,将不胜感激。 谢谢。
您的尝试均无效,因为您正在尝试使用值是Network.NetworkUser
类型的对象的Map
更新文档,这是不可能的,因为您无法将该对象映射到HashMap
。
什么是users
财产? 实际上, 是Map
类型的属性,它包含其他 HashMap 的术语。 所以你需要先获取文档,获取users
属性的值,转换为Map<String, Object>
并放入另一个HashMap
。 这个新的 HashMap 包含一个以电子邮件地址作为键和另一个HashMap
作为值的对象,它同样包含具有两个值的两个键。 将所需数据添加到地图后,只需将文档写回即可。
如果您不希望出现这种行为,您可以简单地在每个 (Network.NetworkUser) 文档下创建一个用户子集合。
这对其他人可能很有用,正如 Alex 在上一篇文章中所说,问题的发生是因为 Firestore 不知道对象“NetworkUser”。 所以处理This的方法是将对象转换成Json String如下:
1.- 在插入之前,创建一个新的 Hashmap<String, String>
2.- 遍历旧的 Hashmap<String, Object>,并使用 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 可以是 <String, String> 或 Firestore 支持的任何其他原始对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.