Firestore删除文档及其引用的所有文档

时间:2018-08-27 23:35:53

标签: firebase dart flutter google-cloud-firestore

这个问题是关于Firebase(+ Flutter)

是否可以删除文档以及引用该文档的所有文档?

假设我具有这样的结构:

-users (collection)
  - name
  - bookmarks ((sub)collection)
    - postId
-post (collection)
  - userId
  - name
  - ...

现在,如果我删除帖子,我想删除所有引用该帖子的书签。 (来自所有用户)。是否有自动方式(来自RDBMS)。

另一个问题: 如何查询所有帖子并“加入”用户信息。

类似这样的东西:

return firestore
        .collection("posts")
        .orderBy("createdAt")
        .snapshots(); // I want to join the userInformation

然后这些嵌套查询又计入api限制了吗?

预先感谢

2 个答案:

答案 0 :(得分:2)

没有自动方法可以执行您想要的操作。 Firestore不是关系数据库,因此不会强制执行文档之间的关系。 Firestore中没有“加入”操作。

您可以查询要删除的文档,然后在重复查询结果后将其全部删除。

答案 1 :(得分:1)

您必须查询文档,然后批量删除它们。我不使用子集合,并且我不会查找如何查询它们,但是使用根级别架构,您可以使用标准的Firestore删除来删除该帖子,并引用documentID。假设documentID与您的“ postID”字段相同(如果不是,则重构您的架构),然后:

final WriteBatch _batch = Firestore.instance.batch();

  QuerySnapshot _query = await dbUsers.where('postId', isEqualTo: thatDocumentID).getDocuments();

  _query.documents.forEach((doc) {
    _batch.delete(dbUsers.document(doc.documentID));
  });

  await _batch.commit();

请注意,一次只能进行500次批处理:

https://firebase.google.com/docs/firestore/manage-data/transactions

所以您必须根据需要拆分_batch.commit()通话。