MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Sesuaikan operasi penyisipan mgo

Untuk menjawab "Pertanyaan Nyata Saya:Bagaimana cara menyesuaikan perilaku mgo sebelum upser? " - Anda dapat menyesuaikan bson marshalling dengan mendefinisikan bson Getter ke modelnya.

Untuk mengilustrasikan cara kerjanya, mari sederhanakan model untuk menghindari dokumen bersarang:

type Game struct {
    ID int `bson:"_id"`
    Name string
    Stats [] float64
}

Dengan newGame sebagai berikut:

newGame := Game{
    ID: 1,
    Name: "foo",
    Stats: []{5.0}
}

Pembaruan col.UpsertId(newGame.ID, newGame) secara default marsekal newGame ke JSON, menghasilkan kueri mongo seperti:

update({_id:1}, {name: "foo", stats: [5]}, {upsert: true});

Untuk menggunakan $set , $push dll, Anda dapat menentukan pengambil bson khusus. Mis.

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
}

Jadi update col.UpsertId(newGame.ID, newGame) akan menghasilkan kueri mongodb

update({_id:1}, {$set: {name: "foo"}, $push: {stats: {$each: [5]}}}, {upsert: true});

Untuk memperjelasnya - custom marshaler akan digunakan di semua kueri mgo, jadi Anda mungkin tidak ingin mendefinisikannya secara langsung ke model, tetapi ke turunannya untuk digunakan hanya dalam operasi upsert:

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. Dokumentasi janji luwak mengatakan pertanyaan bukan janji?

  2. Bagaimana cara menggunakan tipe antarmuka sebagai model di mgo (Go)?

  3. Beberapa temuan sinkron luwak untuk menggunakan kembali ID objek

  4. Menggunakan JSON dengan MongoDB?

  5. meneruskan luwak sebagai argumen ke suatu fungsi