Firebase 在firestore中对集合和亚集合进行迭代

Firebase 在firestore中对集合和亚集合进行迭代,firebase,go,google-cloud-firestore,Firebase,Go,Google Cloud Firestore,我正试图找到一种比嵌套for循环更有效的方法,在带有go的firestore中使用其子集合迭代集合。我有一个叫Place的集合,有一张分集合票 以下是我正在使用的两个结构: type Place struct { PlaceName string `json:"placeName"` PlaceLocation string `json:"placeLocation"` PhoneNumber string

我正试图找到一种比嵌套for循环更有效的方法,在带有go的firestore中使用其子集合迭代集合。我有一个叫Place的集合,有一张分集合票

以下是我正在使用的两个结构:

type Place struct {
    PlaceName     string   `json:"placeName"`
    PlaceLocation string   `json:"placeLocation"`
    PhoneNumber   string   `json:"phoneNumber"`
    NumTickets    []Ticket `json:"numTickets"`
}
下面是我目前掌握的一段代码:

func (*repo) FindAll() ([]entity.Place, error) {
    ctx := context.Background()
    client, err := firestore.NewClient(ctx, projectID)
    if err != nil {
        log.Fatalf("Failed to create a firestore client: %v", err)
        return nil, err
    }

    defer client.Close()

    var places []entity.Place
    it := client.Collection(collectionName).Documents(ctx)
    for {
        doc, err := it.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to iterate: %v", err)
            return nil, err
        }
        ticketRef := doc.Ref.Collection("Ticket")
        var tickets []entity.Ticket
        it := ticketRef.Documents(ctx)
        for {
            doc, err := it.Next()
            if err == iterator.Done {
                break
            }
            if err != nil {
                log.Fatalf("Failed to iterate over tickets: %v", err)
                return nil, err
            }
            ticket := entity.Ticket{
                TicketType:         doc.Data()["TicketType"].(string),
                NumberTicketsAvail: doc.Data()["NumberTicketsAvail"].(int64),
            }

            tickets = append(tickets, ticket)
        }

        place := entity.Place{
            PlaceName:     doc.Data()["PlaceName"].(string),
            PlaceLocation: doc.Data()["PlaceLocation"].(string),
            PhoneNumber:   doc.Data()["PhoneNumber"].(string),
            NumTickets:    tickets,
        }
        places = append(places, place)
    }

    return places, nil

}

你可以用a把店里所有的票都塞进去。你可以用a把店里所有的票都塞进去。
func (*repo) FindAll() ([]entity.Place, error) {
    ctx := context.Background()
    client, err := firestore.NewClient(ctx, projectID)
    if err != nil {
        log.Fatalf("Failed to create a firestore client: %v", err)
        return nil, err
    }

    defer client.Close()

    var places []entity.Place
    it := client.Collection(collectionName).Documents(ctx)
    for {
        doc, err := it.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to iterate: %v", err)
            return nil, err
        }
        ticketRef := doc.Ref.Collection("Ticket")
        var tickets []entity.Ticket
        it := ticketRef.Documents(ctx)
        for {
            doc, err := it.Next()
            if err == iterator.Done {
                break
            }
            if err != nil {
                log.Fatalf("Failed to iterate over tickets: %v", err)
                return nil, err
            }
            ticket := entity.Ticket{
                TicketType:         doc.Data()["TicketType"].(string),
                NumberTicketsAvail: doc.Data()["NumberTicketsAvail"].(int64),
            }

            tickets = append(tickets, ticket)
        }

        place := entity.Place{
            PlaceName:     doc.Data()["PlaceName"].(string),
            PlaceLocation: doc.Data()["PlaceLocation"].(string),
            PhoneNumber:   doc.Data()["PhoneNumber"].(string),
            NumTickets:    tickets,
        }
        places = append(places, place)
    }

    return places, nil

}