У меня вопрос по хранению в MongoDB с использованием mgo.

Моя БД имеет такую структуру:

{
  "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é"
}

В моем приложении Go структуры следующие:

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"'
  }

Но мне не удается создать переменную, чтобы собрать все вместе:

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{},
    }

Моя основная цель состояла бы в том, чтобы было значение по умолчанию, когда я вставляю personita с этим внутри:

"abonnements": {
    "newsletter": false
  }
0
Juanse 5 Сен 2016 в 00:27

3 ответа

Лучший ответ

Кажется просто опечатка

Abonnements : []Abonnement{}
1
Uvelichitel 4 Сен 2016 в 21:33

Решение для наличия вложенных структур:

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"`
}

А потом :

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

Таким образом, вы добавили вложенный JSON в MongoDB со значениями по умолчанию.

Кроме того, в этом конкретном случае StripeID или StripeSub являются необязательными, поэтому, если значение пустое, они не появятся в вашей базе данных.

0
Juanse 11 Сен 2016 в 13:47

Может как то так. Сначала определите функцию, которая возвращает указатель на структуру:

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

Затем вызовите функцию как литерал среза Abonnement:

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

Детская площадка

1
kingSlayer 4 Сен 2016 в 22:23