首頁 >後端開發 >Golang >將 protojson 格式的 Firestore 雲端事件解組到 mapinterface{} 或結構中

將 protojson 格式的 Firestore 雲端事件解組到 mapinterface{} 或結構中

WBOY
WBOY轉載
2024-02-13 23:09:08501瀏覽

将 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.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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除