Marshaling BSON personnalisé
Le marshaling BSON personnalisé est similaire au marshaling JSON personnalisé, mais vous devrez implémenter bson.Getter et bson Interfaces .Setter à la place. Ces interfaces vous permettent de définir comment votre type personnalisé doit être converti vers et depuis les données BSON.
Par exemple, disons que vous disposez d'un type de devise qui nécessite un marshaling personnalisé :
package yourpackage import ( "context" "errors" "github.com/globalsign/mgo/bson" "github.com/shopspring/decimal" ) type Currency struct { Value decimal.Decimal CurrencyCode string } func (c Currency) GetBSON() (interface{}, error) { if c.CurrencyCode == "" { return nil, errors.New("CurrencyCode cannot be empty") } return bson.M{ "value": c.Value.String(), "currencyCode": c.CurrencyCode, }, nil } func (c *Currency) SetBSON(raw bson.Raw) error { var m bson.M if err := raw.Unmarshal(&m); err != nil { return err } val, ok := m["value"] if !ok { return errors.New("missing 'value' field in BSON data") } c.Value, _ = decimal.NewFromString(val.(string)) code, ok := m["currencyCode"] if !ok { return errors.New("missing 'currencyCode' field in BSON data") } c.CurrencyCode, _ = code.(string) return nil }
Avec cette implémentation, vous pouvez désormais enregistrer votre type de devise personnalisé avec l'encodeur MGO BSON :
session := mgo.Dial("mongodb://localhost:27017") defer session.Close() session.SetCollectionValidator("products",{ "validator":{ "$jsonSchema":{ "bsonType":"object", "required":["name","code","price"], "properties":{ "name":{"bsonType":"string"}, "code":{"bsonType":"string"}, "price":{ "bsonType":"object", "required":["value", "currencyCode"], "properties":{ "value":{"bsonType":"string", "pattern":"^[0-9,]+(.[0-9,]+)?$"}, "currencyCode":{"bsonType":"string", "enum":["USD", "EUR", "GBP"]}, }, }, } } } }) collection := session.DB("products").C("products")
Maintenant, lorsque vous enregistrez un document avec un champ Devise dans MongoDB, l'encodeur MGO utilisera automatiquement votre fonction de marshaling personnalisée pour convertir la devise en BSON.
Notez qu'il ne s'agit que d'un exemple de la façon dont vous pouvez ajouter un marshaling personnalisé pour les types BSON. La mise en œuvre spécifique variera en fonction des exigences de votre application particulière.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!