登录
首页 >  Golang >  Go问答

似乎无法获取带有子集合的文档

来源:stackoverflow

时间:2024-04-09 19:45:32 248浏览 收藏

golang学习网今天将给大家带来《似乎无法获取带有子集合的文档》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

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

/timeentries/2018/2018-10/2018-10-15/events
/timeentries/2018/2018-10/2018-10-22/events

上面的2018是一个文档,2018-10是一个子集合,2018-10-152018-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 是字符串,因此这将包括 id 为 2018-10-152018-10-22 的文档。因此,当您对字符串进行排序时,结果是按字典顺序排序的,我认为这不是您想要的。因此,如果您想通过数值查询集合,则需要将文档 id 写为数值。

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

好了,本文到此结束,带大家了解了《似乎无法获取带有子集合的文档》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>