php小编子墨在这篇文章中将介绍如何将 protojson 格式的 Firestore 云事件解组到 map[interface{}] 或结构中。Firestore 是 Google Cloud 提供的一种灵活的文档型数据库解决方案,而 protojson 则是一种将 Protocol Buffers 数据转换为 JSON 格式的工具。了解如何解组 Firestore 云事件是开发者在使用 Firestore 数据库时的重要技能,本文将详细讲解解组的步骤和注意事项,帮助开发者更好地利用 Firestore 数据库的功能。
是否有一种简单的方法可以将 protojson 格式的 firestore 数据解组到 map[string]interface{} 或结构中,而无需使用所有 protobuf 数据类型标签?即展平 protojson 数据。
我有一个 google 云函数,每当创建新的 firebase 文档(“云事件”)时就会触发该函数。此云事件包含上下文信息,包括以 protojson 格式修改的文档:
import ( "google.golang.org/protobuf/encoding/protojson" "github.com/davecgh/go-spew/spew" ) func cloudfunction(ctx context.context, e event.event) error { data := firestoredata.documenteventdata{} _ = protojson.unmarshal(e.dataencoded, &data); spew.dump(data) }
--------console output-------- { "oldvalue": {}, "value": { "createtime": "2023-03-30t00:00:00.000000z", "updatetime": "2023-03-30t00:00:00.000000z", "name": "projects/myproject/databases/(default)/documents/collectionname/00000000-0000-0000-0000-000000000000", "fields": { "id": { "stringvalue": "00000000-0000-0000-0000-000000000000" }, "action": { "stringvalue": "serverdosomething" }, "payload": { "mapvalue": { "fields": { "questionslist": { "arrayvalue": { "values": [ { "mapvalue": { "fields": { "title": { "stringvalue": "how do i fly a kite?" }, } } }, { "mapvalue": { "fields": { "title": { "stringvalue": "how do i fly a plane?" }, } } } ] } } } } } } }, "updatemask": {} }
我想将此 protojson 文档的块编组到自定义 go 结构中,以轻松验证每种类型的条目,如下所示:
// cloudeventrequest is a struct that wraps around one or more data validation structs contained in the payload cloudeventrequest { id: "00000000-0000-0000-0000-000000000000" action: "serverdostuff" payload: map{ "questionslist": []question{ question{ title: "how do i fly a kite?" }, question{ title: "how do i fly a plane?" } } } }
firestore sdk 包含一个 datato 方法,可轻松将 protojson 格式的数据解组为自定义结构。我正在尝试做一些非常类似的事情,但已经在 firestore sdk 之外获取了文档数据。
// datato uses the document's fields to populate p, which can be a pointer to a map[string]interface{} or a pointer to a struct. func (*firestore.documentsnapshot).datato(p interface{}) error
import ( "context" "cloud.google.com/go/firestore" ) func FirestoreRead(docEvent firestoredata.DocumentEventData) error { ctx := context.Background() ref := h.client.Collection("mycollection").Doc(docEvent.value.ID) docSnapshot, err := tx.Get(ref) dataValidationStruct := CloudEventRequest{} err = docSnapshot.DataTo(&dataValidationStruct) }
我编写了一个名为“firestruct”的开源 Go 包来解决这个挑战。您可以在这里找到它:github.com/bennovw/firestruct 非常欢迎您的反馈和贡献!
我最终编写了一个函数,以递归方式将 Firestore 字段解包到匹配的映射中。然后,我重构了 cloud.google.com/go/firestore 中的 DataTo() 方法以解组我的地图到一个结构中。
以上是将 protojson 格式的 Firestore 云事件解组到 mapinterface{} 或结构中的详细内容。更多信息请关注PHP中文网其他相关文章!