【发布时间】:2014-01-17 22:22:02
【问题描述】:
我正在尝试从高度嵌套的 go 结构构建 mongo 文档,但在从 go 结构到 mongo 对象的转换时遇到了问题。我已经构建了一个 非常 简化版本的我正在尝试使用的内容:http://play.golang.org/p/yPZW88deOa
package main
import (
"os"
"fmt"
"encoding/json"
)
type Square struct {
Length int
Width int
}
type Cube struct {
Square
Depth int
}
func main() {
c := new(Cube)
c.Length = 2
c.Width = 3
c.Depth = 4
b, err := json.Marshal(c)
if err != nil {
panic(err)
}
fmt.Println(c)
os.Stdout.Write(b)
}
运行它会产生以下输出:
&{{2 3} 4}
{"Length":2,"Width":3,"Depth":4}
这完全有道理。似乎 Write 函数或 json.Marshal 函数具有一些折叠嵌套结构的功能,但是当我尝试使用 mgo 函数 func (*Collection) Upsert (http://godoc.org/labix.org/v2/mgo#Collection.Upsert) 将此数据插入 mongo 数据库时,我的问题就出现了。如果我首先使用json.Marshal() 函数并将字节传递给collection.Upsert(),它会以二进制形式存储,这是我不想要的,但如果我使用collection.Upsert(bson.M("_id": id, &c),它会显示为嵌套结构,格式如下:
{
"Square": {
"Length": 2
"Width": 3
}
"Depth": 4
}
但我想做的是使用与我使用 os.Stdout.Write() 函数时相同的结构更新 mongo:
{
"Length":2,
"Width":3,
"Depth":4
}
我是否缺少一些可以轻松处理此问题的标志?在这一点上我能看到的唯一选择是通过删除结构的嵌套来严重降低代码的可读性,我真的很讨厌这样做。同样,我的实际代码比这个例子复杂得多,所以如果我可以通过保持嵌套来避免使代码更加复杂,那肯定会更好。
【问题讨论】: