我可以获取从 Firestore 集合组查询中获取的文档的路径或引用吗?

Posted

技术标签:

【中文标题】我可以获取从 Firestore 集合组查询中获取的文档的路径或引用吗?【英文标题】:can I get the path or reference of the document fetched from Firestore collection group query? 【发布时间】:2021-06-19 23:21:00 【问题描述】:

所以我想像这样执行集合组查询,以获取收件箱中的所有过期消息文档

const oneMonthAgo = moment().subtract(1, "month").toDate();

db.collectionGroup("inbox")
.where("createdAt", "<", oneMonthAgo)
.get();

inbox实际上是users集合中的一个子集合,所以路径会是这样的:

users/userID/inbox/messageID

使用上面的集合组查询代码获取所有过期消息后,我需要删除所有这些过期消息。要删除消息文档,我需要知道文档的路径/引用

我可以从消息文档中的字段中获取 messageID。但我不知道用户 ID 是,所以我不知道删除该消息的完整路径/参考

users/ ?????? /inbox/messageID

那么我可以从上面的集合组查询代码的结果中获取用户ID吗?因为我需要使用此代码删除消息文档

db.doc(`users/$??????/inbox/$messageID`).delete()

上面的代码将返回一个FirebaseFirestore.DocumentData 的承诺。我需要从集合组查询中获取文档的路径或引用。

我可以这样做吗?

【问题讨论】:

【参考方案1】:

给定一个消息文档,您可以通过遍历其引用的parent 链来确定用户:

const messages = await db.collectionGroup("inbox")
  .where("createdAt", "<", oneMonthAgo)
  .get();
messages.forEach((messageSnapshot) => 
  const messageRef = messageSnapshot.ref;
  const inboxRef = messageRef.parent;
  const userRef = inboxRef.parent;
  console.log(userRef.id); // logs the id of the user document this message is for
);

另见How to return parent collection based on subcollection document value in Firestore?

【讨论】:

以上是关于我可以获取从 Firestore 集合组查询中获取的文档的路径或引用吗?的主要内容,如果未能解决你的问题,请参考以下文章

从获取的文档中获取文档引用 (Firestore)

从 Firestore 的一个集合中获取所有文档

需要从 Firestore 的多个集合中查询

如何在 Cloud Firestore 中使用文档 ID 执行集合组查询

Firestore - 从集合中的文档中获取集合条目

Firestore 从集合中获取数组