Как конвертировать из структуры в документ с помощью mongo-go-driver - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь использовать $push, чтобы поместить структуру go в массив mongo.Документы go, которые я упростил для этого примера, выглядят так:

type Main struct {
   ID       objectid.ObjectID `bson:"_id"`
   Projects []*Project        `bson:"proj"`
}

type Project struct {
   ID    objectid.ObjectID `bson:"_id"`
   Name  string            `bson:"name"`
}

Я хочу сделать $push новый Project для массива Main.Projects.То, что я в итоге делал, довольно болезненно, поэтому я надеюсь, что есть лучший способ.Смотрите здесь:

// Create the new project struct:
newProj := &Project{
  ID: objectid.New(),
  Name: "foo",
}

// Then marshall bson:
bsbuf, err := bsoncodec.Marshal(newProj)
if err != nil {
    // ...
}

// Next read the bytes into a document:
bsonDoc, err := bson.ReadDocument(bsbuf)
if err != nil {
    // ...
}

// Now create the update document:
upd := bson.NewDocument(
    bson.EC.SubDocument("$push", bson.NewDocument(
        bson.EC.SubDocument("proj", bsonDoc))))

// And perform update as usual
// ... not shown ...

Действительно ли необходимо транскодировать в байтовый буфер, а затем читать в документ?Я надеялся на что-то вроде:

...
bson.EC.GoStruct("proj", newProj)
...

Я попробовал bson.EC.Interface("proj", newProj), но это просто вставило нули в массив.Мне любопытно узнать, как другие делают такие вещи.

1 Ответ

0 голосов
/ 25 октября 2018

Вы правы, есть более простой способ сделать это:

newProj := &Project{
    ID: objectid.New(),
    Name: "foo",
}

upd := bson.M{
    "$push": bson.M{"proj": newProj},
}

Я использую github.com/globalsign/mgo/bson

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...