gpt4 book ai didi

firebase - 似乎无法获取包含子集合的文档

转载 作者:IT王子 更新时间:2023-10-29 02:20:10 26 4
gpt4 key购买 nike

我有一个带有子集合的树状结构,我可以构建、插入对象和从中获取对象,但我无法在中间列出文档。这棵树看起来像

/TimeEntries/2018/2018-10/2018-10-15/Events
/TimeEntries/2018/2018-10/2018-10-22/Events

上面2018是文档,2018-10是子集合,2018-10-15 2018-10-22 是包含 Events 子集合的文档。

这是用类似的东西做的

func SaveEvents(week time.Time, events []Event) {
colref := client.Collection("TimeEntries").Doc(week.Format("2006")).Collection(week.Format("2006-01")).Doc(week.Format("2006-01-02")).Collection("Events")
batch := client.Batch()

for _, event := range events {
batch.Set(colref.Doc(strconv.Itoa(event.Id)), event)
}
if _, err := batch.Commit(context.Background()); err != nil {
log.Fatalf("unable to create event docs: %v", err)
}
}

有时我会想要按周和按月的事件。我现在可以按周获取事件,但要按月获取事件,我必须获取树中间的文档列表,然后获取它们子集合的文档。不幸的是,试图在树的中间列出文档是行不通的;这总是记录 0 个事件:

func FetchEventsForMonth(week time.Time) {
colref := client.Collection("TimeEntries").Doc(week.Format("2006")).Collection(week.Format("2006-01"))

snaps, err := colref.Documents(context.Background()).GetAll()
if err != nil {
log.Printf("cannot fetch docs: %v", err)
return
}

log.Printf("%d events", len(snaps))
}

我在文档中看不到任何解释此行为的内容。我错过了什么?

最佳答案

当您使用以下集合引用时:

colref := client.Collection("TimeEntries").Doc(week.Format("2006")).Collection(week.Format("2006-01"))

这意味着您从数据库中获取的2006-01 集合中的文档并且仅获取那些文档,仅此而已。遗憾的是,在 Firestore 中无法同时获取 Events 集合中的所有文档,该集合是单个查询中 2006-01-02 文档中的子集合。 Firestore 中的查询很浅:它们仅从运行查询的集合中获取项目。无法在单个查询中从另一个顶级集合和其他集合或子集合中获取文档。 Firestore 不支持一步跨不同集合的查询。单个查询只能使用单个集合中文档的属性。

如果您想通过 documentId 在您的 Cloud Firestore 数据库中查询单个集合中的文档,您可以使用 FieldPath.documentId() 实现此目的,如下所示:

client.collection.where(firebase.firestore.FieldPath.documentId(), '<', 'yourDate').get();

但请注意,文档 ID 是 String,因此这将包括 ID 类似于 2018-10-152018-10-22< 的文档。所以当你对字符串排序时,结果是按字典顺序排序的,我认为这不是你想要的。因此,如果您想通过数值查询集合,则需要将文档 ID 写为数值。

但在这种情况下,最有效的解决方案是通过创建一个包含 event 文档的集合并在每个事件对象下添加一个日期属性来简化您的数据库,以便您可以根据它。在这种情况下,您可以使用 Firestore SDK 提供的所有功能并使用范围比较(<、<=、>、>=)进行过滤。

关于firebase - 似乎无法获取包含子集合的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53080331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com