Golang RethinkDB ChangeFeed结构

时间:2017-04-07 14:01:14

标签: go struct unmarshalling rethinkdb

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

var message map[string]interface{}

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

地图[new_val:地图[club_id:ea2eb6e2-755f-4dad-922D-e3693b6e55c6   日期:2017-04-07 14:48:17.714 +0100 +01:00   id:e389ab54-963e-4b33-9b34-adcb6ec5b17e留言:生命是什么意思?   user_id:00ff679f-9421-4b8b-ae7f-d11cf2adaee2] old_val:]

但是,我希望将响应映射到struct 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"`
}

感谢。

2 个答案:

答案 0 :(得分:0)

我明白了!

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

上一个代码:

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

工作代码:

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

现在.Next()值映射到我的struct而没有任何问题。

答案 1 :(得分:0)

如果您想将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