【问题标题】:Firestore get document where subcollection existFirestore 获取存在子集合的文档
【发布时间】:2021-12-28 08:16:03
【问题描述】:

这可能吗?经过一番研究,我找不到办法。

我的“解决方法”是首先获取所有 subCollection 文档,然后检索它们的父键并再次检索。但我相信有更好的方法来做到这一点。

let subDocs = await firestoreDb.collectionGroup('sub_collections').get()
let parentDocKeys = {};
subDocs.docs.forEach(async (element) => {
    parentDocKeys[element.ref.parent.parent.id] = 1;
});
let result = await firestoreDb.collection('parentCollection').where(firestore.FieldPath.documentId(), 'in', Object.keys(parentDocKeys)).get();
return res.send(result.docs.map(x=>x.data()));

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    Firestore 查询只能根据文档本身的数据过滤文档。无法检查任何其他文档中的数据,无论是在同一个集合中,还是在其他(子)集合中。

    这意味着在不更改父文档中的数据的情况下,无法仅检索存在子集合的文档。例如,如果每次向子集合添加/删除时更新父文档中的字段(例如 hasSubcollectionBla),则可以过滤该字段的值。

    您这样做是为了使数据的写入更加复杂,从而使读取/查询变得更容易且更具可扩展性。这是使用 NoSQL 数据库(例如 Firestore)时的常见权衡。

    【讨论】:

    • 感谢您的解释和建议!这里还有一个问题......为此使用firestore触发器是否合适?只是有点担心,如果我有该文档的多个子集合,那么我将不得不在此处维护 hasSubCollection1/2/3... 与相应的 Firestore 触发器。
    • 如果您只想检查文档是否有任何子集合,那么“hasSubcollection: true”字段就可以正常工作。每当您添加一个额外的子集合并更新父文档以具有该字段时,它只会将该值重写为 true。如果您需要检查文档是否有特定的子集合,那么您必须拥有您提到的 hasSubcollection 1/2/3 之类的东西。
    • 是的,这可以在云函数中完美完成,也可以在客户端代码中完成 - 例如在添加/删除子集合时进行批量写入。拥有多个标志字段对我来说并不是一个问题:您可以在 1MB 文档限制内放置很多标志。 :)
    猜你喜欢
    • 2019-10-06
    • 2019-11-13
    • 1970-01-01
    • 2018-04-09
    • 2022-07-08
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多