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

我想要创造一个未来,将每一个待办事项更新为假,这是正确的。(以我为例,那就是“运动”和“健康饮食”)
我的问题是:我真的不知道该怎么做。。。
如果有人能帮我,我会非常感激的。
发布于 2021-12-12 16:04:34
您希望将To-Dos映射中的每个字段设置为false,即true。因此,我建议将每个字段更新为false。您可能会考虑检查它是否是true,然后更新它。但是对于用例来说,这不是一个很好的选择,因为无论如何,您希望将每个字段设置为false。检查和更新只会导致查询的额外费用。下面的内容应该适用于您的用例。
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集合中的每个文档。
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映射,可以执行以下操作-
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});
});发布于 2021-12-12 15:57:14
这里没有神奇的解决办法。对于当前的数据模型,唯一的方法是:
false todo更改为“`true”降低成本的唯一方法是将#1改为只读取具有false值的文档。在您当前的模型中,只有当To-Dos是数组时才有可能,然后只有在其中包含一个过滤器的最多10个值。
collectionRef.where("To-Dos", arrayContainsAny: [{
"Drink Water": false,
"Sport": false,
"eat healthy": false
}]如果该字段中的键是由用户输入的,则上述内容可能变得不可行,因为其中最多只能有10个值。在这种情况下,解决方案是更改数据模型以满足您的需要(在使用NoSQL数据库时非常常见)。例如,您可以存储一个简单的顶级hasUncompletedTasks字段,每次编写文档时都会更新该字段,然后将其用于查询。
https://stackoverflow.com/questions/70322292
复制相似问题