我正在使用Golang(用于API定义的Go-Swagger)和Firestore作为文档存储来构建自定义Web服务。一切工作正常,除了在数据库更新上“笨拙”。我有一个解决方案,但我不认为这是最优雅的解决方案。还有其他人遇到过这个问题,他们是如何解决的......
问题陈述:当我写入数据库时,零值正在覆盖Firebase中的现有值
建议的解决方案-MY API在可选参数上具有json:“ omitempty”,并且将传入nil值(与获取默认golang值相对)。我打算将传递给API的Struct和一个attr一次装入Firestore正在使用的Struct中。我有性能问题,但不想将我的API Struct与我的DB Struct结合在一起。我还将在Firestore结构上设置firestore:“ omitempty”`字符串文字,就像API Struct一样。我希望这将告诉Firestore不要写任何为零的值。
这是最好的方法吗?他们还有其他选择吗? golang的默认值似乎有加和减。
更新:
我最终与拟议的解决方案位于相似的地方,但也遵循了Dimitry的建议。我创建了一个[] firestore.Update对象,以仅包含要更新的值。当我调用firestore时,它只会更新这些值。
这是我用来调用Firestore的函数。
func updateProfileUsingUpdateMethod(documentName string, values []firestore.Update) error {
ctx := context.Background()
app := firestorehelper.GetFirestoreApp()
client, err := app.Firestore(ctx)
if err != nil {
return err
}
defer client.Close()
//Set the updated date
wr, error := client.Doc(collectionName+"/"+documentName).Update(ctx, values)
if error != nil {
return error
}
fmt.Println(wr.UpdateTime)
//Assume success
return nil
}
我还创建了一个firestore.Update对象,并将其附加到我的[] firestore.Update切片中。
firestore.Update{Path: "PATH_TO_ATTR", Value: VALUE_TO_PASS_IN}
答案 0 :(得分:0)
您有两个选择:
map[string]interface{}
使用具有firestore
属性-firestore:"FieldName,omitempty"
的自定义结构。
_,err:= client.Collection(“ city”)。Doc(“ DC”)。Set(ctx,map [string] interface {} { “资本”:是的, },firestore.MergeAll) 如果err!= nil { //以适当的方式处理所有错误,例如将其返回。 log.Printf(“发生错误:%s”,错误) }
请勿将json
omitempty
与firestore
混淆。
您还必须提供字段名称,因为此语法将使用omitempty
作为名称。
firestore:"omitempty" - not correct
https://firebase.google.com/docs/firestore/manage-data/add-data