"मेरा वास्तविक प्रश्न:मैं अपरर्ट से पहले एमजीओ के व्यवहार को कैसे अनुकूलित कर सकता हूं? का उत्तर देने के लिए " - आप bson Getter को परिभाषित करके bson marshalling को कस्टमाइज़ कर सकते हैं मॉडल को।
यह कैसे काम करता है यह स्पष्ट करने के लिए, नेस्टेड दस्तावेज़ों से बचने के लिए मॉडल को सरल बनाएं:
type Game struct {
ID int `bson:"_id"`
Name string
Stats [] float64
}
निम्नलिखित के रूप में newGame के साथ:
newGame := Game{
ID: 1,
Name: "foo",
Stats: []{5.0}
}
अपडेट col.UpsertId(newGame.ID, newGame) डिफ़ॉल्ट मार्शल द्वारा newGame JSON में, mongo क्वेरी जैसे:
update({_id:1}, {name: "foo", stats: [5]}, {upsert: true});
$set . का उपयोग करने के लिए , $push आदि, आप एक कस्टम bson गेटर परिभाषित कर सकते हैं। उदा.
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
}
तो अपडेट col.UpsertId(newGame.ID, newGame) एक मोंगोडब क्वेरी उत्पन्न करेगा
update({_id:1}, {$set: {name: "foo"}, $push: {stats: {$each: [5]}}}, {upsert: true});
इसे स्पष्ट करने के लिए - कस्टम मार्शलर का उपयोग सभी एमजीओ प्रश्नों में किया जाएगा, इसलिए आप शायद इसे सीधे मॉडल में परिभाषित नहीं करना चाहते हैं, लेकिन इसके व्युत्पन्न के लिए केवल अप्सर्ट संचालन में उपयोग करना चाहते हैं:
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})