go - mongodb中的嵌套结构

时间:2018-01-19 06:56:22

标签: mongodb go bson mgo

我在golang与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,
    },
}

并得到了这两个错误:

  • 字段:值和值初始值设定项的混合

  • undefined:Foo

或者是否需要使用bson.M处理结构(DummyStructA)

回复的问题:)

2 个答案:

答案 0 :(得分:1)

  

你可以这样做

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))
}
  

OutPut就像这样

test data
{"user":"test","foo":{"barA":123,"bar_b":321}}
  

尝试去游戏场地:https://play.golang.org/p/s32pMvqP6Y8

答案 1 :(得分:0)

如果您在问题中定义了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,
     }
}