Golang RethinkDB ChangeFeed 结构

Golang RethinkDB ChangeFeed Structure

我想知道是否有人可以解释如何将我的 changefeed 游标值解组为特定的结构类型。

var message map[string]interface{}

for chatFeedCursor.Next(&message) {
    fmt.Println(message)
}

map[new_val:map[club_id:ea2eb6e2-755f-4dad-922d-e3693b6e55c6 date:2017-04-07 14:48:17.714 +0100 +01:00 id:e389ab54-963e-4b33-9b34-adcb6ec5b17e message:what is the meaning of life? user_id:00ff679f-9421-4b8b-ae7f-d11cf2adaee2] old_val:]

但是,我希望将响应映射到结构 ChatMessage。

更新:

我试过:

var message ChatMessage

但是,似乎我的任何数据都没有设置到结构中。

{ 0001-01-01 00:00:00 +0000 UTC}

我的结构:

type ChatMessage struct {
    ID      string        `json:"id" gorethink:"id,omitempty"`
    UserID      string    `json:"user_id" gorethink:"user_id"`
    ClubID      string    `json:"club_id" gorethink:"club_id"`
    Message     string    `json:"message" gorethink:"message"`
    Date    time.Time     `json:"date" gorethink:"date"`
}

谢谢。

我想通了!

问题是我没有在 rethinkdb 更改请求中指定字段。

前一个代码:

chatFeedCursor, _ := gorethink.Table("club_chat").Changes().Run(gorethinkSession)

工作代码:

chatFeedCursor, _ := gorethink.Table("club_chat").Changes().Field("new_val").Run(gorethinkSession)

现在 .Next() 值毫无问题地映射到我的结构。

如果您想将 changefeed 游标值解组为特定的结构类型,但同时保留新值和旧值,您可以使用库将通用映射值解码为原生 Go 结构,例如 mapstructure, 得到一个整洁的结果:

导入地图结构:

import (
   ...
    "github.com/mitchellh/mapstructure"
   ...
)

现在您可以执行以下操作:

    cursor, err := r.Table("club_chat").
        Changes().
        Run(db.Session)

    if err != nil {
        // manage error
    }

    var changeFeed map[string]interface{}
    for cursor.Next(&changeFeed) {

        var oldVal, newVal ChatMessage
        if changeFeed["old_val"] != nil {
            mapstructure.Decode(changeFeed["old_val"], &oldVal)
        }

        if changeFeed["new_val"] != nil {
            mapstructure.Decode(changeFeed["new_val"], &newVal)
        }

      // Do what you want with the values