Another release of the mgo Go driver for MongoDB hits the repository.
Here is the selection of fixes and improvements:
Improved timeouts
The timeout support has been improved to include socket-level deadlines. This better manages cases when the TCP connection with the server is silently interrupted.
The default socket deadline matches the previously documented timeout of 10 seconds for the connection establishment and one minute thereafter.
If the DialWithTimeout function is used, or the DialInfo.Timeout field is provided to DialWithInfo, the provided timeout will be used as both the initial sync timeout and the initial socket timeout.
Customizing the socket timeout independently is also possible via the new Session.SetSocketTimeout method.
omitempty flag for struct values
Marshalled structs (explicitly or via mgo) can now also use the omitempty flag in struct fields. A struct field is considered “empty” if the current value matches the zero value for the respective struct.
Thanks to Alex S. for suggesting the feature.
mgo/txn handling of multiple operations for the same document
The mgo/txn multi-document transaction support package will now correctly handle multiple operations in the same document within a single transaction.
Before the fix, only the first operation would work due to a miscalculation of the internal sequence of transaction ids for the following documents. This means that the change should not affect existent code, unless the code was already not functioning properly.
Having this working means that doing an Insert+Update on a single document will insert the document if it doesn’t exist, and then always update the document (previously existent or newly inserted).
On the other hand, doing it in the inverted order, as Update+Insert, is a nice to way to say “either update or insert”, as only a single one of them can possibly work depending on whether the document previously exited or not.
Thanks to Jesse van den Kieboom for reporting the problem.
New bson.RawD document type
It’s easier to explain the new document type in comparison to the previously existent bson.D
type, which allows marshalling a bson document with a slice of names and values, such as:
bson.D{{"field1", 42}, {"field2", "forty two"}}
Besides being a representation that is flexible and relatively compact (if compared to a map), it also allows the field ordering to be respected when being delivered to the server, which is required by some features of MongoDB.
The new bson.RawD type is similar, but rather than using interface{}
element values as observed with bson.D
, all values have a bson.Raw type, containing the the raw bson []byte
data and kind for the respective field value. This offers a convenient and efficient way to lazily process whole documents or subdocuments (by using the type in a field).
This feature was inspired by a need reported by Daniel Gottlieb.