Перебор коллекции и вложенной коллекции в firestore

# #firebase #go #google-cloud-firestore

#firebase #Вперед #google-облако-firestore

Вопрос:

Я пытаюсь найти более эффективный способ перебора коллекции с ее вложенными коллекциями в firestore с помощью go, чем вложенный цикл for . У меня есть коллекция под названием Place с билетом вложенной коллекции.

Это две структуры, с которыми я работаю:

 type Place struct {
    PlaceName     string   `json:"placeName"`
    PlaceLocation string   `json:"placeLocation"`
    PhoneNumber   string   `json:"phoneNumber"`
    NumTickets    []Ticket `json:"numTickets"`
}
  
 type Ticket struct {
    TicketType         string `json:"ticketType"`
    NumberTicketsAvail int64  `json:"numberTicketsAvail"`
}
  

И вот фрагмент кода, который у меня есть на данный момент:

 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

}
  

Комментарии:

1. Вы можете получить все билеты в хранилище с помощью запроса группы коллекций .