首页 > 解决方案 > 如何使用结构获取和存储文档 ID

问题描述

我已经定义了一个这样的数据结构:

type Person struct {
    Name string `firestore:"name,omitempty"`
}

当我查询集合中的所有文档时,我希望能够将 ID 附加到文档以供以后参考,但不一定将 ID 作为存储在 Firestore 中的属性(除非它是唯一的方法)。在 javascript 或 python 中,这很简单,因为数据结构是动态的,我可以查询 ID 帖子get()并将其添加为动态键/值。myObj.id = doc.id

我将如何使用 Go 执行此操作?

package main

import (
    "fmt"
    "cloud.google.com/go/firestore"
    "context"
    "google.golang.org/api/iterator"
    "log"
)

type Person struct {
    Name string `firestore:"name,omitempty"`
}

func main() {
    ctx := context.Background()

    c, err := firestore.NewClient(ctx, "my-project")
    if err != nil {
        log.Fatalf("error: %v",  err)
    }
    
    var people []Person
    
    iter := c.Collection("people").Documents(ctx)
    for {
        doc, err := iter.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("error: %v",  err)
        }

        var p Person
        err = doc.DataTo(p)
        if err != nil {
            log.Fatalf("error: %v",  err)
        }
        // id := doc.Ref.ID
        people = append(people, p)
    }

    fmt.Println(people)
}

输出,无ID

>> [{John Smith}]

标签: gogoogle-cloud-firestore

解决方案


我相信 firestore 结构标签的工作方式与encoding/json包中的标签相同。因此,值为“-”的标签意味着忽略该字段。所以

type Person struct {
    ID   int `firestore:"-"`
    Name string `firestore:"name,omitempty"`
}

应该做的伎俩。

您可以自己设置 ID,但 firestore pkg 在读取/写入数据时会忽略它。


推荐阅读