Przeczytałem to Przyjazny artykuł O kodowaniu i dekodowaniu obiektu niestandardowego za pomocą oficjalnego sterownika Go Mongo.

Jest ładny przykład, jak uzbrojenie ich w rozszerzonym formacie JSON (bson.MarshalExtJSONWithRegistry). Ale chciałbym wiedzieć, jak umieścić ten dokument do kolekcji za pomocą InserOne() (a później. Spójrz na ten Pseudo Kod:

// myReg - variable created according to linked article in question.

// WithRegistry do **not** exist in mongo-driver lib is part of pseudocode
mongoCollection := client.Database("db").Collection("coll").WithRegistry(myReg)
// Now InserOne() honor myReg (type *bsoncodec.Registry) when serialize `val` and puting it into mongodb
mongoCollection.InsertOne(context.TODO(), val)

Przejdę przez API DOC i znaleźliśmy, są Marshaler i Unmarshaler interfejsy, ale w drodze w sposób mógłby być w stanie (DE) serializację tego samego typu w inny sposób na różnych kolekcji (na przykład, gdy migruje ze starego formatu do nowego).

Tak więc pytanie jest jak używać *bsoncodec.Registry z funkcjami kolekcji (jak {x1}}, UpdateOne, FindOne itp.) Jeśli nie jest to najbardziej idiomatyczny sposób na osiągnięcie mojego celu ( Niestandardowe (de) serializacje).

2
S.R 28 październik 2020, 16:40

1 odpowiedź

Najlepsza odpowiedź

Database.Collection() Metoda ma "Opcjonalnie" { {X1}} parametr, który ma opcję ustawić bsoncodec.Registry. Jeśli zdobędziesz swoją kolekcję za pomocą konfigurowanych opcji z rejestrem, który rejestr zostanie użyty ze wszystkimi operatorami wykonanymi dzięki tej kolekcji.

Użyj tego w ten sposób:

opts := options.Collection().SetRegistry(myReg)
c := client.Database("db").Collection("coll", opts)

Cytowanie z mojej powiązanej odpowiedzi: Jak ignorować null Podczas gdy Unmarshalling dokumentu MongoDB?

Rejestry mogą być ustawione / stosowane na wielu poziomach, nawet do całości {{ X0}} lub do a {x1}} lub tylko do {x2}} , podczas ich nabycia w ramach ich opcji, np {x3}}.

Kiedy więc nie robisz migracji ze starego do nowego formatu, możesz ustawić rejestr na poziomie "klienta" i "być wykonane z nim". Twój rejestr i niestandardowe kodery / dekodery zostaną zastosowane za każdym razem, gdy kierowca zajmuje się wartością zarejestrowanego typu niestandardowego.

1
icza 28 październik 2020, 14:08