将 protojson 格式的 Firestore 云事件解组到 mapinterface{} 或结构中
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/protobuf/encoding/protojson"
"github/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/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/bennovw/firestruct
非常欢迎您的反馈和贡献!
我最终编写了一个函数,以递归方式将 Firestore 字段解包到匹配的映射中。然后,我重构了 cloud.google/go/firestore 中的 DataTo() 方法以解组我的地图到一个结构中。
相关推荐
-
从 MySQL/Go 表获取行数据
php小编小新在这篇文章中将向大家介绍如何从MySQL/Go表获取行数据。MySQL是一种流行的关系型数据库管理系统,而Go是一种强大的开发语言。在开发过程中,我们经常需要从数据库中获取数据并进行处理
-
PHP SPL 数据结构:数据管理的终极武器
php spl数据结构是php标准库中提供的一组数据结构和算法,被称为数据管理的终极武器。php小编新一将为您详细介绍spl数据结构的特点和用法,帮助您更好地利用这些强大的工具来管理和处理数据。无论是
-
高效快速的Golang数据转换技巧
在软件开发中,数据的转换是一项常见的任务,特别是在处理复杂数据结构或不同数据类型的情况下。在Go语言中,也称为Golang,有许多快速高效的方法来处理数据转换,让开发人员可以轻松地在不同数据类型之间转
-
Python数据分析:数据驱动成功之路
python 数据分析涉及使用 Python 编程语言从各种数据源中收集、清理、探索、建模和可视化数据。它提供了强大的工具和库,例如 NumPy、pandas、Scikit-learn 和 Matpl
-
示例及解析:C语言中scanf函数的输入格式
C语言是一种十分重要的程序设计语言,很多初学者在学习和使用C语言的过程中,经常会用到输入函数scanf()。通过scanf()函数,我们可以从用户处获取输入数据,然后将其存储到指定的变量中。本文将介绍















