gpt4 book ai didi

mongodb - 使用 mgo 存储嵌套结构

转载 作者:IT老高 更新时间:2023-10-28 13:04:30 26 4
gpt4 key购买 nike

我正在尝试从高度嵌套的 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< 将此数据插入 mongo 数据库时出现问题(http://godoc.org/labix.org/v2/mgo#Collection.Upsert)。如果我首先使用 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
}

我是否缺少一些可以轻松处理此问题的标志?在这一点上我能看到的唯一选择是通过删除结构的嵌套来严重降低代码的可读性,我真的很讨厌这样做。同样,我的实际代码比这个例子复杂得多,所以如果我可以通过保持嵌套来避免使代码更加复杂,那肯定会更好。

最佳答案

我认为使用 inline 字段标签是您的最佳选择。 mgo/v2/bson documentation状态:

inline     Inline the field, which must be a struct or a map,
causing all of its fields or keys to be processed as if
they were part of the outer struct. For maps, keys must
not conflict with the bson keys of other struct fields.

你的结构应该被定义如下:

type Cube struct {
Square `bson:",inline"`
Depth int
}

编辑

inline 也存在于 mgo/v1/bson 中,以防你使用那个。

关于mongodb - 使用 mgo 存储嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20849591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com