在Firestore中忽略Nil值的最佳做法

时间:2019-01-02 19:24:41

标签: firebase go google-cloud-firestore

我正在使用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}

1 个答案:

答案 0 :(得分:0)

您有两个选择:

  1. 使用map[string]interface{}
  2. 使用具有firestore属性-firestore:"FieldName,omitempty"的自定义结构。

    _,err:= client.Collection(“ city”)。Doc(“ DC”)。Set(ctx,map [string] interface {} {         “资本”:是的, },firestore.MergeAll) 如果err!= nil {         //以适当的方式处理所有错误,例如将其返回。         log.Printf(“发生错误:%s”,错误) }

请勿将json omitemptyfirestore混淆。

您还必须提供字段名称,因为此语法将使用omitempty作为名称。

firestore:"omitempty" - not correct

https://firebase.google.com/docs/firestore/manage-data/add-data

code