Я пытаюсь использовать $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)
, но это просто вставило нули в массив.Мне любопытно узнать, как другие делают такие вещи.