mongodb 中的嵌套结构
nested struct in mongodb
我使用以下软件包:
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
我尝试处理嵌套结构并将其放入 mongodb。
以下代码可以正确完成工作,但我不知道这是否正确。
// init
type DummyStruct struct {
User string `bson:"user"`
Foo FooType `bson:"foo"`
}
type FooType struct {
BarA int `bson:"bar_a"`
BarB int `bson:"bar_b"`
}
// main
foobar := DummyStruct{
User: "Foobar",
Foo: FooType{
BarA: 123,
BarB: 456,
},
}
// Insert
if err := c.Insert(foobar); err != nil {
panic(err)
}
是否需要分两部分构建嵌套结构?
如果我使用 json->golang 结构转换器 (https://mholt.github.io/json-to-go/)
我将得到以下结构
type DummyStructA struct {
User string `bson:"user"`
Foo struct {
BarA int `bson:"bar_a"`
BarB int `bson:"bar_b"`
} `bson:"foo"`
}
现在我不知道如何填充这个结构。
我试过这个:
foobar := DummyStructA{
User: "Foobar",
Foo: {
BarA: 123,
BarB: 456,
},
}
但出现此错误:复合文字中缺少类型
我也试过这个
foobar := DummyStructA{
User: "Foobar",
Foo{
BarA: 123,
BarB: 456,
},
}
并得到这 2 个错误:
field:value 和值初始值设定项的混合
未定义:Foo
或者是否需要用 bson.M 处理结构体 (DummyStructA)?
如果您在问题中定义了 2 个不同的结构。您需要像这样声明 foobar
:
foobar := DummyStructA{
User: "Foobar",
Foo: FooType{
BarA: 123,
BarB: 456,
},
}
但是没有必要定义第二种类型来处理这种情况。您可以使用匿名 struct
,例如:
type DummyStructA {
User string `bson:"user"`
Foo struct{
Name string `bson:"name"`
Age int `bson:"age"`
} `bson: "foo"`
}
但是在尝试填写数据时变得很麻烦。
foobar := DummyStructA{
User: "hello",
Foo : struct{
Name string
Age int
}{
Name: "John",
Age: 50,
}
}
你可以这样做
package main
import (
"fmt"
"encoding/json"
)
type DummyStruct struct {
User string `bson:"user" json:"user"`
Foo FooType `bson:"foo" json:"foo"`
}
type FooType struct {
BarA int `bson:"barA" json:"barA"`
BarB int `bson:"bar_b" json:"bar_b"`
}
func main() {
test:=DummyStruct{}
test.User="test"
test.Foo.BarA=123
test.Foo.BarB=321
b,err:=json.Marshal(test)
if err!=nil{
fmt.Println("error marshaling test struct",err)
return
}
fmt.Println("test data\n",string(b))
}
输出是这样的
test data
{"user":"test","foo":{"barA":123,"bar_b":321}}
我使用以下软件包:
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
我尝试处理嵌套结构并将其放入 mongodb。 以下代码可以正确完成工作,但我不知道这是否正确。
// init
type DummyStruct struct {
User string `bson:"user"`
Foo FooType `bson:"foo"`
}
type FooType struct {
BarA int `bson:"bar_a"`
BarB int `bson:"bar_b"`
}
// main
foobar := DummyStruct{
User: "Foobar",
Foo: FooType{
BarA: 123,
BarB: 456,
},
}
// Insert
if err := c.Insert(foobar); err != nil {
panic(err)
}
是否需要分两部分构建嵌套结构?
如果我使用 json->golang 结构转换器 (https://mholt.github.io/json-to-go/)
我将得到以下结构
type DummyStructA struct {
User string `bson:"user"`
Foo struct {
BarA int `bson:"bar_a"`
BarB int `bson:"bar_b"`
} `bson:"foo"`
}
现在我不知道如何填充这个结构。
我试过这个:
foobar := DummyStructA{
User: "Foobar",
Foo: {
BarA: 123,
BarB: 456,
},
}
但出现此错误:复合文字中缺少类型
我也试过这个
foobar := DummyStructA{
User: "Foobar",
Foo{
BarA: 123,
BarB: 456,
},
}
并得到这 2 个错误:
field:value 和值初始值设定项的混合
未定义:Foo
或者是否需要用 bson.M 处理结构体 (DummyStructA)?
如果您在问题中定义了 2 个不同的结构。您需要像这样声明 foobar
:
foobar := DummyStructA{
User: "Foobar",
Foo: FooType{
BarA: 123,
BarB: 456,
},
}
但是没有必要定义第二种类型来处理这种情况。您可以使用匿名 struct
,例如:
type DummyStructA {
User string `bson:"user"`
Foo struct{
Name string `bson:"name"`
Age int `bson:"age"`
} `bson: "foo"`
}
但是在尝试填写数据时变得很麻烦。
foobar := DummyStructA{
User: "hello",
Foo : struct{
Name string
Age int
}{
Name: "John",
Age: 50,
}
}
你可以这样做
package main
import (
"fmt"
"encoding/json"
)
type DummyStruct struct {
User string `bson:"user" json:"user"`
Foo FooType `bson:"foo" json:"foo"`
}
type FooType struct {
BarA int `bson:"barA" json:"barA"`
BarB int `bson:"bar_b" json:"bar_b"`
}
func main() {
test:=DummyStruct{}
test.User="test"
test.Foo.BarA=123
test.Foo.BarB=321
b,err:=json.Marshal(test)
if err!=nil{
fmt.Println("error marshaling test struct",err)
return
}
fmt.Println("test data\n",string(b))
}
输出是这样的
test data
{"user":"test","foo":{"barA":123,"bar_b":321}}