MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tùy chỉnh hoạt động nâng cấp của mgo

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bộ lọc ngày Mongoose

  2. Làm thế nào để chuyển đổi Date thành UTC trong MongoMapper &Ruby / Rails?

  3. Sự cố khi cài đặt mongodb bằng Homebrew

  4. Mongodb 2.4 2dsphere truy vấn rất chậm (sử dụng $ geoIntersects)?

  5. Có chức năng tầng nào trong khung tổng hợp Mongodb không?