登录
首页 >  Golang >  Go问答

利用结构体来实现文档ID的获取和存储方法

来源:stackoverflow

时间:2024-02-15 18:27:22 211浏览 收藏

一分耕耘,一分收获!既然都打开这篇《利用结构体来实现文档ID的获取和存储方法》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

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

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

当我查询集合中的所有文档时,我希望能够将 id 附加到文档以供以后参考,但不一定将 id 作为存储在 firestore 中的属性(除非这是唯一的方法)。在 javascript 或 python 中,这很简单,因为数据结构是动态的,我只需查询 id post 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}]

正确答案


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

type person struct {
    id   int `firestore:"-"`
    name string `firestore:"name,omitempty"`
}

应该可以解决问题。

你可以自己设置id,但是firestore pkg在读/写数据时会忽略它。

如果你想将firestore文档id存储在person类型上,你的结构必须有一个声明的字段为了它。

Golang firestore 文档没有明确提及这一点,但由于 firestore 文档 id 不是文档字段的一部分,因此 func (*DocumentSnapshot) DataTo 不会填充该 id。相反,您可以从 DocumentRef type 获取文档 id,然后自己将其添加到 person

该文档还指出:

因此,如果您想在编组回 firestore 时省略 id,可以使用标签 firestore:"-"

person 看起来像这样:

type person struct {
    id   string `firestore:"-"`
    name string `firestore:"name,omitempty"`
}

循环内:

var p Person
err := docSnap.DataTo(&p)
if err != nil {
    // handle it
}
p.ID = doc.Ref.ID

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>