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
我想知道是否有人可以解释如何将我的 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