duanposhi3641
duanposhi3641
2016-09-04 21:27
浏览 146

使用Golang在MongoDb中插入嵌套结构

I have a question regarding storage in MongoDB using mgo. My DB has this structure :

{ "Arrival": [ "04-09-2016" ], "Clicks": [ "56ffd41d9c8c9adf088b4576", "4f1dc63a7c2d3817640000a1" ], "Recherches": [ "érysipèle" ], "abonnements": { "newsletter": false }, "compte": "Standard", "datei": ISODate("2016-09-04T14:55:39.179Z"), "email": "_°°°°_", "mdp": "27d8d166ca1f1715541b7df6453401b95a1d59c2ca0f60ce71037d33926c4d6f09a63a909a8d5cb5230f92584973a4dd2b8bcf155d5785ef7e2afdd113334eee", "type": "T&D", "user": "_°°°°_", "validation": "validé" }

In my Go application the structures are :

My structures are :

type Abonnement struct {
    Newsletter bool bson:"newsletter"'
  }

type Persone struct {
    Compte string 'bson:"compte"'
    Datei time.Time 'bson:"datei"'
    Email string  'bson:"email"'
    MDP string 'bson:"mdp"'
    Type string 'bson:"T&D"'
    User string 'bson:"user"'
    Validation string 'bson:"validation"'
    Arrival []string 'bson:"Arrival"'
    Clicks []string 'bson:"Clicks"'
    Recherches []string 'bson:"Recherches"'
    Abonnements []Abonnement 'bson:"abonnements"'
  }

But I can't manage to create the variable to put everything together :

personita := Persone{ Compte : "Standard", Datei : time.Date(2015, time.February, 12, 04, 11, 0, 0, time.UTC), Email : "test@test.com", MDP : "test_mdp", Type : "T&D", User : "test_user", Validation : "validé", Arrival : []string{}, Clicks : []string{}, Recherches : []string{}, Abonnements : []Abonnement{}, }

My main goal would be that there's a default value when I insert 'personita' with this inside : "abonnements": { "newsletter": false }

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • dongyipa0028
    dongyipa0028 2016-09-04 21:33
    已采纳

    Seems just a typo

    Abonnements : []Abonnement{}
    
    点赞 评论
  • dsjz1119
    dsjz1119 2016-09-04 22:11

    Maybe something like this. First define a function that returns a pointer to the structure:

    func NewAbonnement()(ab *Abonnement){
        return &Abonnement{Newsletter: false}
    }
    

    Then call the function as Abonnement slice literal:

     personita := Persone{
          Compte : "Standard",
          Datei : time.Date(2015, time.February, 12, 04, 11, 0, 0, time.UTC),
          Email : "test@test.com",
          MDP : "test_mdp",
          Type : "T&D",
          User : "test_user",
          Validation : "validé",
          Arrival  : []string{},
          Clicks : []string{},
          Recherches : []string{},
          Abonnements : []Abonnement{*NewAbonnement()},
        }
    

    Playground

    点赞 评论
  • douchenchepan6465
    douchenchepan6465 2016-09-11 13:47

    The solution for having Nested structures is to do:

    type Abonnement struct {
      Newsletter bool `bson:"newsletter"`
      StripeID string `bson:"stripe_id,omitempty"`
      StripeSub string `bson:"stripe_sub,omitempty"`
    }
    
    type Personne struct {
      Compte string `bson:"compte"`
      Datei time.Time `bson:"datei"`
      Email string  `bson:"email"`
      MDP string `bson:"mdp"`
      Type string `bson:"T&D"`
      User string `bson:"user"`
      Validation string `bson:"validation"`
      Arrival []string `bson:"Arrival"`
      Clicks []string `bson:"Clicks"`
      Recherches []string `bson:"Recherches"`
      Abonnements Abonnement `bson:"abonnements"`
    }
    

    and then :

    personita := Personne{
        Compte : "Standard",
        Datei : time.Date(2015, time.February, 12, 04, 11, 0, 0, time.UTC),
        Email : "test@test.com",
        MDP : "test_mdp",
        Type : "T&D",
        User : "test_user",
        Validation : "validé",
        Abonnements : Abonnement{false,"",""},
       }
    
    if err := coll.Insert(personita); err != nil {panic(err)}
    

    This way you have the nested JSON added to MongoDB with default values.

    Furthermore, in this particular case, StripeID or StripeSub are optional, hence if the value is empty they won't appear on your database.

    点赞 评论

相关推荐