首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在云火药库中更新地图中的每个真正的密钥对?

如何在云火药库中更新地图中的每个真正的密钥对?
EN

Stack Overflow用户
提问于 2021-12-12 09:16:05
回答 2查看 78关注 0票数 0

我正在开发一个带有颤振的应用程序。我的每个用户都有一张地图,他们的待办事项存储在云火药库中:

我想要创造一个未来,将每一个待办事项更新为假,这是正确的。(以我为例,那就是“运动”和“健康饮食”)

我的问题是:我真的不知道该怎么做。。。

如果有人能帮我,我会非常感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-12 16:04:34

您希望将To-Dos映射中的每个字段设置为false,即true。因此,我建议将每个字段更新为false。您可能会考虑检查它是否是true,然后更新它。但是对于用例来说,这不是一个很好的选择,因为无论如何,您希望将每个字段设置为false。检查和更新只会导致查询的额外费用。下面的内容应该适用于您的用例。

代码语言:javascript
运行
复制
CollectionReference users = FirebaseFirestore.instance.collection('users');

Future<void> updateUserToDos() {
 return users
     .doc('your_document_id')
     .update({
       'To-Dos.Drink Water': false,
       'To-Dos.Sport': false,
       'To-Dos.eat healthy': false
     })
     .then((value) => print("User To-Dos Updated"))
     .catchError((error) => print("Failed to update user: $error"));
}

若要了解有关更新Firestore文档字段的更多信息,请参阅本文件

编辑

因此,您不知道To-Dos映射中有哪些字段,需要将To-Dos映射中的每个字段更新为false。为此,您可以遍历映射的键,并更新具有与现有映射的键相同的新映射和值为false的新映射,然后使用更新后的新地图更新To-Dos映射字段。您可以使用以下代码。它将更新users集合中的每个文档。

代码语言:javascript
运行
复制
FirebaseFirestore.instance
       .collection('users')
       .get()
       .then((QuerySnapshot querySnapshot) {
     querySnapshot.docs.forEach((doc) {
       var updateMap = new Map();
       var toDos = doc['To-Dos'];
       for (var item in toDos.keys) {
         updateMap[item] = false;
       }
       doc.reference.update({"To-Dos":updateMap });
     });
});

若要更新任何特定文档中的To-Dos映射,可以执行以下操作-

代码语言:javascript
运行
复制
FirebaseFirestore.instance
       .collection('users')
       .doc("your_document_id")
       .get()
       .then((DocumentSnapshot doc) {
     var updateMap = new Map();
     var toDos = doc['To-Dos'];
     for (var item in toDos.keys) {
       updateMap[item] = false;
     }
     doc.reference.update({"To-Dos": updateMap});
   });
票数 1
EN

Stack Overflow用户

发布于 2021-12-12 15:57:14

这里没有神奇的解决办法。对于当前的数据模型,唯一的方法是:

  1. 阅读所有文件
  2. 将任何false todo更改为“`true”
  3. 如果您做了任何更改,请将文档写回去。

降低成本的唯一方法是将#1改为只读取具有false值的文档。在您当前的模型中,只有当To-Dos是数组时才有可能,然后只有在其中包含一个过滤器的最多10个值。

代码语言:javascript
运行
复制
collectionRef.where("To-Dos", arrayContainsAny: [{
  "Drink Water": false,
  "Sport": false,
  "eat healthy": false
}]

如果该字段中的键是由用户输入的,则上述内容可能变得不可行,因为其中最多只能有10个值。在这种情况下,解决方案是更改数据模型以满足您的需要(在使用NoSQL数据库时非常常见)。例如,您可以存储一个简单的顶级hasUncompletedTasks字段,每次编写文档时都会更新该字段,然后将其用于查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70322292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档