Firebase 在firestore中对集合和亚集合进行迭代
我正试图找到一种比嵌套for循环更有效的方法,在带有go的firestore中使用其子集合迭代集合。我有一个叫Place的集合,有一张分集合票 以下是我正在使用的两个结构: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
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
}