在Firestore中更新值时没有字段错误

时间:2019-01-02 20:59:26

标签: database firebase go google-cloud-firestore

我正在尝试使用golang库更新Firestore中的文档。由于某种原因,我收到一个错误:“无字段\“ BirthYear \”错误,我不确定为什么。出生年份绝对是我要更新的值之一。

我认为我的结构配置不正确,但是我看不到如何做。这是我的结构和更新代码:

共享结构。个人资料

type Profile struct {
    UID                string                `json:"UID" firestore:"UID"`
    ContactEmail       string                `json:"ContactEmail,omitempty" firestore:"ContactEmail"`
    BirthMonth         int64                 `json:"BirthMonth,omitempty" firestore:"BirthMonth"`
    BirthYear          int64                 `json:"BirthYear,omitempty" firestore:"BirthYear"`
    Gender             string                `json:"Gender,omitempty" firestore:"Gender"`
    Unit               string                `json:"Unit,omitempty" firestore:"Unit"`
    CurrentStatus      string                `json:"CurrentStatus,omitempty" firestore:"CurrentStatus"`
    Country            string                `json:"Country,omitempty" firestore:"Country"`
    ExperienceType     string                `json:"ExperienceType,omitempty" firestore:"ExperienceType"`
    DateJoined         time.Time             `json:"DateJoined,omitempty" firestore:"DateJoined"`
    Abilities          []Ability             `json:"Abilities,omitempty" firestore:"Abilities"`
    Goals              []Goal                `json:"Goals,omitempty" firestore:"Goals"`
    Roles              []Role                `json:"Roles,omitempty" firestore:"Roles"`
    TermsAndConditions []TermsAndConditions  `json:"TermsAndConditions,omitempty" firestore:"TermsAndConditions"`
    TimeZone           string                `json:"TimeZone,omitempty" firestore:"TimeZone"`
    BaselineTests      []BaselineTestResults `json:"BaselineTests,omitempty" firestore:"BaselineTests"`
    UpdatedDate        time.Time             `json:"UpdatedDate,omitempty" firestore:"UpdatedDate"`
    FirstName          *string               `json:"FirstName,omitempty" firestore:"FirstName"`
    LastName           string                `json:"LastName,omitempty" firestore:"LastName"`
    DisplayName        string                `json:"DisplayName,omitempty" firestore:"DisplayName"`
}

更新功能

func updateProfileWithSpecficValues(documentName string, values sharedstructs.Profile, overwriteValues []string) error {
    ctx := context.Background()
    app := firestorehelper.GetFirestoreApp()

    client, err := app.Firestore(ctx)
    if err != nil {
        return err
    }
    defer client.Close()

    //Set the updated date
    values.UpdatedDate = time.Now()
    wr, error := client.Doc(collectionName+"/"+documentName).Set(ctx, values, firestore.Merge(overwriteValues))
    if error != nil {
        return error
    }
    fmt.Println(wr.UpdateTime)
    //Assume success
    return nil
}

2 个答案:

答案 0 :(得分:0)

https://godoc.org/cloud.google.com/go/firestore#Merge

  

Merge返回一个SetOption,它仅导致给定的字段路径为   被覆盖。现有文档中的其他字段将保持不变。   如果提供的字段路径未引用传递给Set的数据中的值,则会出现错误。

您没有在array:2 [▼ "less than 20" => 1 "older than 20" => 0 ] 中发送BirthYear(默认值),但是在values中指定了BirthYear

答案 1 :(得分:0)

从cloud.google.com/go/firestore v1.3.0开始,当Set(..., valueStruct, firestore.Merge(sliceOfPaths))是您可能会读取或写入的完整结构时,我认为您无法通过valueStruct完成更新消防站。

我收到一个错误字符串,其中包含OP引用的'no field“ [SomeFieldName]”字符串,但是此错误中有更多信息。如果我的sliceOfPaths引用了我的结构的两个元素的名称,例如一个int和一个time.Time,我经常会收到错误,例如'no field“ [NameOfMyIntField]的值为2020-09-14T00:00 :00Z“',反之亦然,它尝试使用整数更新我的Firestore文档的时间字段。

我只是使用Update()而不是Set()。这有点笨拙,因为您必须传递Update()原始结构的特制子集(firestore.Update的一部分),但是它可以工作。