如何在Flatter firebase中删除一对多关联

如何在Flatter firebase中删除一对多关联,firebase,flutter,google-cloud-firestore,nosql,one-to-many,Firebase,Flutter,Google Cloud Firestore,Nosql,One To Many,我正在开发一个颤振应用程序,并使用firebase数据库作为数据库服务 现在我的应用程序是任务管理应用程序,因此我的数据库有三个主要集合: +角色 +任务 +使用者 每个角色都是一个具有唯一id和名称的文档 每个任务都是一个具有唯一id、名称和角色id的文档 现在在应用程序中,用户可以在数据库中添加角色,我只需向角色集合添加一个新的角色文档 但是,当涉及到删除一个角色时,我被卡住了 显然,角色和任务是一对多的关联,因为一个角色可以与一个或多个任务关联,但一个任务最多只能有一个角色 因此,当我想要

我正在开发一个颤振应用程序,并使用firebase数据库作为数据库服务

现在我的应用程序是任务管理应用程序,因此我的数据库有三个主要集合:

+角色

+任务

+使用者

每个角色都是一个具有唯一id和名称的文档

每个任务都是一个具有唯一id、名称和角色id的文档

现在在应用程序中,用户可以在数据库中添加角色,我只需向角色集合添加一个新的角色文档

但是,当涉及到删除一个角色时,我被卡住了

显然,角色和任务是一对多的关联,因为一个角色可以与一个或多个任务关联,但一个任务最多只能有一个角色

因此,当我想要删除一个角色时,我必须同时删除与其关联的任务,并且只有删除该角色才会在任务中生成空错误,因为它在数据库中找不到指定的角色

现在,我在FlatterFirebase文档中真的没有找到任何关于如何根据所选标准删除多个文档的提示

例如,根据文档id删除一个文档非常简单

Future<void> deleteRole(Role role) {
final reference = databaseInstance.document('/roles/${role.id}');
return reference.delete();
}
未来删除角色(角色){
final reference=databaseInstance.document('/roles/${role.id}');
return reference.delete();
}
如果我想阅读一个基于某些标准的任务,比如someId,我会写这样的东西

Stream<List<Task>> readTasksStream({@required String someId}) {
    Stream<QuerySnapshot> snapshots = databaseInstance
    .collection('tasks')
    .where('someId', isEqualTo: someId)
    .snapshots();

//now deserialize the data to objects and return it 

return snapshots.map((snapshot) => snapshot.documents
    .map((snapshot) => Task.fromMap(snapshot.data))
    .toList());
}
Stream readTasksStream({@required String someId}){
流快照=数据库实例
.collection(“任务”)
.where('someId',isEqualTo:someId)
.快照();
//现在将数据反序列化到对象并返回它
返回snapshot.map((snapshot)=>snapshot.documents
.map((快照)=>Task.fromMap(快照.data))
.toList());
}
但是,对于删除基于someId的任务(在本例中是roleId),我如何才能做到同样的事情呢。 大概是这样的:

deleteTasksAssociatedWithARole({@required String roleId}) {
    Stream<QuerySnapshot> snapshots = databaseInstance
    .collection('tasks')
    .where('someId', isEqualTo: someId)
    .snapshots();

    //now I want to delete the selected document from the querysnapshot
    // but how ???????? 
}
Future<void> deleteTasksAssociatedWithARole({@required Role role}) {
   Stream<QuerySnapshot> snapshots = databaseInstance
    .collection('tasks')
    .where('roleId', isEqualTo: role.id)
    .snapshots();

   return snapshots.forEach((snapshot) =>
    snapshot.documents.forEach((document) => document.reference.delete()));
}
DeleteTasksAssociatedWithRole({@required String roleId}){
流快照=数据库实例
.collection(“任务”)
.where('someId',isEqualTo:someId)
.快照();
//现在我想从querysnapshot中删除所选文档
//但是怎么做呢????????
}
我希望你能得到我想要的。 欢迎任何建议或帮助。
非常感谢您

要通过查询删除所有匹配的文档,您需要对
forEach
流进行循环,然后依次删除它们

比如:

snapshots.forEach((snapshot) => snapshot.documents
    .forEach((snapshot) => Task.fromMap(snapshot.data))
    .toList());
}
snapshots.forEach((document) => document.reference.delete());
我发现,通过遵循参考文档中的类型(在本例中是从中的类型)可以最容易地找到如何做到这一点。

非常感谢,它现在起作用了。 最后的代码是这样的:

deleteTasksAssociatedWithARole({@required String roleId}) {
    Stream<QuerySnapshot> snapshots = databaseInstance
    .collection('tasks')
    .where('someId', isEqualTo: someId)
    .snapshots();

    //now I want to delete the selected document from the querysnapshot
    // but how ???????? 
}
Future<void> deleteTasksAssociatedWithARole({@required Role role}) {
   Stream<QuerySnapshot> snapshots = databaseInstance
    .collection('tasks')
    .where('roleId', isEqualTo: role.id)
    .snapshots();

   return snapshots.forEach((snapshot) =>
    snapshot.documents.forEach((document) => document.reference.delete()));
}
Future DeleteTasksAssociatedWithRole({@required Role}){
流快照=数据库实例
.collection(“任务”)
.where('roleId',isEqualTo:role.id)
.快照();
返回快照。forEach((快照)=>
snapshot.documents.forEach((document)=>document.reference.delete());
}
因此,与其将文档快照反序列化为对象,不如使用forEach循环遍历它们,提取其引用以删除文档