如何在扑扑的火力中删除一对多关联

问题描述 投票:0回答:1

我正在开发一个Flutter应用程序,并且正在使用Firebase数据库作为数据库服务。

现在,由于我的应用程序是任务管理应用程序,所以我的数据库具有三个主要集合:

+角色

+任务

+用户

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

每个任务都是一个具有唯一标识,名称和角色标识的文档

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

但是在删除角色时我陷入困境。

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

因此,当我要删除角色时,我也必须删除与其关联的任务,并且仅删除该角色会在任务中生成空错误,因为它不再在数据库中找到指定的角色。 >

现在,我真的在flutter Firebase文档中找不到有关如何根据所选条件删除多个文档的任何提示。

例如,基于文档ID删除一个文档很简单

Future<void> deleteRole(Role role) {
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());
}

但是在这种情况下,我如何实际删除基于someId的任务呢?像这样的东西:

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 ???????? 
}

我希望你能在这里得到我想要的。任何建议或帮助都非常欢迎。非常感谢

我正在开发一个Flutter应用程序,并且正在使用Firebase数据库作为数据库服务。现在,由于我的应用程序是任务管理应用程序,因此我的数据库具有三个主要集合:+角色+任务+ ...

firebase flutter google-cloud-firestore nosql one-to-many
1个回答
0
投票

要删除查询中所有匹配的文档,请在forEach的流上循环,然后依次删除它们。

© www.soinside.com 2019 - 2024. All rights reserved.