goext/mongo/bson/mgocompat/doc.go

58 lines
3.1 KiB
Go
Raw Normal View History

2023-06-18 15:50:55 +02:00
// Copyright (C) MongoDB, Inc. 2022-present.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Package mgocompat provides Registry, a BSON registry compatible with globalsign/mgo's BSON,
// with some remaining differences. It also provides RegistryRespectNilValues for compatibility
// with mgo's BSON with RespectNilValues set to true. A registry can be configured on a
// mongo.Client with the SetRegistry option. See the bsoncodec docs for more details on registries.
//
// Registry supports Getter and Setter equivalents by registering hooks. Note that if a value
// matches the hook for bsoncodec.Marshaler, bsoncodec.ValueMarshaler, or bsoncodec.Proxy, that
// hook will take priority over the Getter hook. The same is true for the hooks for
// bsoncodec.Unmarshaler and bsoncodec.ValueUnmarshaler and the Setter hook.
//
// The functional differences between Registry and globalsign/mgo's BSON library are:
//
// 1) Registry errors instead of silently skipping mismatched types when decoding.
//
// 2) Registry does not have special handling for marshaling array ops ("$in", "$nin", "$all").
//
// The driver uses different types than mgo's bson. The differences are:
//
// 1. The driver's bson.RawValue is equivalent to mgo's bson.Raw, but uses Value instead of Data and uses Type,
// which is a bsontype.Type object that wraps a byte, instead of bson.Raw's Kind, a byte.
//
// 2. The driver uses primitive.ObjectID, which is a [12]byte instead of mgo's
// bson.ObjectId, a string. Due to this, the zero value marshals and unmarshals differently
// for Extended JSON, with the driver marshaling as {"ID":"000000000000000000000000"} and
// mgo as {"Id":""}. The driver can unmarshal {"ID":""} to a primitive.ObjectID.
//
// 3. The driver's primitive.Symbol is equivalent to mgo's bson.Symbol.
//
// 4. The driver uses primitive.Timestamp instead of mgo's bson.MongoTimestamp. While
// MongoTimestamp is an int64, primitive.Timestamp stores the time and counter as two separate
// uint32 values, T and I respectively.
//
// 5. The driver uses primitive.MinKey and primitive.MaxKey, which are struct{}, instead
// of mgo's bson.MinKey and bson.MaxKey, which are int64.
//
// 6. The driver's primitive.Undefined is equivalent to mgo's bson.Undefined.
//
// 7. The driver's primitive.Binary is equivalent to mgo's bson.Binary, with variables named Subtype
// and Data instead of Kind and Data.
//
// 8. The driver's primitive.Regex is equivalent to mgo's bson.RegEx.
//
// 9. The driver's primitive.JavaScript is equivalent to mgo's bson.JavaScript with no
// scope and primitive.CodeWithScope is equivalent to mgo's bson.JavaScript with scope.
//
// 10. The driver's primitive.DBPointer is equivalent to mgo's bson.DBPointer, with variables
// named DB and Pointer instead of Namespace and Id.
//
// 11. When implementing the Setter interface, mgocompat.ErrSetZero is equivalent to mgo's
// bson.ErrSetZero.
package mgocompat