Để trả lời " Câu hỏi thực sự của tôi:Làm cách nào để tôi có thể tùy chỉnh hành vi của mgo trước khi nâng cấp? "- bạn có thể tùy chỉnh bson marshalling bằng cách xác định bson Getter vào mô hình.
Để minh họa cách nó hoạt động, hãy đơn giản hóa mô hình để tránh các tài liệu lồng nhau:
type Game struct {
ID int `bson:"_id"`
Name string
Stats [] float64
}
Với newGame như sau:
newGame := Game{
ID: 1,
Name: "foo",
Stats: []{5.0}
}
Bản cập nhật col.UpsertId(newGame.ID, newGame)
theo nguyên soái mặc định newGame
vào JSON, tạo truy vấn mongo như:
update({_id:1}, {name: "foo", stats: [5]}, {upsert: true});
Để sử dụng $set
, $push
vv, bạn có thể xác định một getter bson tùy chỉnh. Ví dụ:
func (g Game) GetBSON() (interface{}, error) {
return bson.M{
"$set": bson.M{"name": g.Name},
"$push": bson.M{"stats": bson.M{"$each": g.Stats}},
}, nil
}
Vì vậy, bản cập nhật col.UpsertId(newGame.ID, newGame)
sẽ tạo ra một truy vấn mongodb
update({_id:1}, {$set: {name: "foo"}, $push: {stats: {$each: [5]}}}, {upsert: true});
Để làm cho nó rõ ràng - trình sắp xếp tùy chỉnh sẽ được sử dụng trong tất cả các truy vấn mgo, vì vậy bạn có thể không muốn định nghĩa nó trực tiếp cho mô hình, mà là dẫn xuất của nó để chỉ sử dụng trong các hoạt động nâng cấp:
type UpdatedGame struct {
Game
}
func (g UpdatedGame) GetBSON() (interface{}, error) {
return bson.M{....}
}
.....
newGame := Game{
ID: 1,
Name: "foo",
Stats: []{5.0}
}
col.UpsertId(newGame.ID, UpdatedGame{newGame})