我正在尝试使用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
}
答案 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
的一部分),但是它可以工作。