Go Firestore получить все документы из коллекции - PullRequest
0 голосов
/ 25 апреля 2020

Создание веб-приложения с использованием go и firestore. У меня странная проблема. Если я сохраню данные, используя метод NewDo c

    ref := client.Collection("blogs").NewDoc()

    _, err := ref.Set(ctx, mapBlog)
    if err != nil {
        // Handle any errors in an appropriate way, such as returning them.
        log.Printf("An error has occurred: %s", err)
    }

, у меня будет возможность извлечь всю коллекцию, используя

    var bs models.Blogs
    iter := client.Collection("blogs").Documents(ctx)
    for {
        var b models.Blog
        doc, err := iter.Next()
        if err != nil {
            fmt.Println(err)
        }
        if err == iterator.Done {
            break
        }
        if err := doc.DataTo(&b); err != nil {
            fmt.Println(doc.Data())
            bs = append(bs, b)

        }
    }

Теперь, это здорово, когда я просто хочу посмотреть все документы в коллекции блогов. Но затем я сталкиваюсь с проблемой невозможности запросить определенный c блог из коллекции блогов. Я решил эту проблему, посмотрев документацию и сохранив подобные сообщения.

//p is a struct and p.ID is just a string identifier
// the docs show creating a struct with an ID and then an embedded struct within. 
_, err := client.Collection("blogs").Doc(p.ID).Set(ctx, p) 

    if err != nil {
        fmt.Println(err)
    }

Но так как я сам создаю docID, я извлекаю все документы из всей коллекции, используя

 if err := doc.DataTo(&b); err != nil {
            fmt.Println(doc.Data())
            bs = append(bs, b)
            fmt.Println(b)
        }

больше не работает. По сути, мне нужно иметь возможность загружать все блоги для одной страницы, а затем, если щелкнуть конкретный блог, мне нужно иметь возможность получить идентификатор и go найти только один документ в коллекции. Почему do c .DataTo не будет работать, если я сам установлю Do c ID?

Есть ли лучший способ, как правило, просто извлечь все документы из коллекции, а затем специально извлечь один документ?

1 Ответ

1 голос
/ 25 апреля 2020

Программа добавляет блоги к результату только тогда, когда doc.DataTo(&b) возвращает ошибку.

Введите код, подобный следующему:

var bs models.Blogs
iter := client.Collection("blogs").Documents(ctx)
defer iter.Stop() // add this line to ensure resources cleaned up
for {
    doc, err := iter.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        // Handle error, possibly by returning the error
        // to the caller. Break the loop or return.
        ... add code here
    }
    var b models.Blog
    if err := doc.DataTo(&b); err != nil {
        // Handle error, possibly by returning the error 
        // to the caller. Continue the loop, 
        // break the loop or return.
        ... add code here
    }
    bs = append(bs, b)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...