duanposhi3641
duanposhi3641
2016-09-04 21:27

使用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 5年前

    Seems just a typo

    Abonnements : []Abonnement{}
    
    点赞 评论 复制链接分享
  • douchenchepan6465 douchenchepan6465 5年前

    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.

    点赞 评论 复制链接分享
  • dsjz1119 dsjz1119 5年前

    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

    点赞 评论 复制链接分享

相关推荐