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

时间:2018-10-31 09:38:06

标签: firebase go google-cloud-firestore

我有一个带有子集合的树状结构,可以构建这些子集合,将对象插入其中或从中进行提取,但是我无法在中间列出文档。树看起来像

/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 events

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))
}

我在说明此行为的文档中看不到任何内容。我想念什么?

1 个答案:

答案 0 :(得分:0)

使用以下集合参考时:

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个文档的单一集合并在每个事件对象下添加一个date属性来简化数据库,以便您可以根据它查询数据库。在这种情况下,您可以使用Firestore SDK提供的所​​有功能并通过范围比较(<,<=,>,> =)进行过滤。