Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GODRIVER-852 Add documentation warning against the use of duplicate key names #614

Merged
merged 5 commits into from
Apr 16, 2021
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions bson/bson.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ type Zeroer interface {
// D is an ordered representation of a BSON document. This type should be used when the order of the elements matters,
// such as MongoDB command documents. If the order of the elements does not matter, an M should be used instead.
//
// A D should not be constructed with duplicate key names, as that can cause undefined server behavior.
//
// Example usage:
//
// bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}
Expand Down
7 changes: 5 additions & 2 deletions mongo/collection.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,9 @@ func (coll *Collection) insert(ctx context.Context, documents []interface{},
//
// The document parameter must be the document to be inserted. It cannot be nil. If the document does not have an _id
// field when transformed into BSON, one will be added automatically to the marshalled document. The original document
// will not be modified. The _id can be retrieved from the InsertedID field of the returned InsertOneResult.
// will not be modified. The _id can be retrieved from the InsertedID field of the returned InsertOneResult. The document
// parameter should NOT contain duplicate key names, as that can result in undefined behavior from the server.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this apply to any CRUD function that results in a document getting inserted or replaced? (FindOneAndReplace, ReplaceOne, Replace). As well as the insert models for bulk write.

If that is right, then I think we'd want to document them all, or just document bson.D. My vote goes for just bson.D.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Discussed offline: it seems like overkill to document every CRUD function that results in a document getting inserted or replaced. Instead, we've opted to only warn against duplicate keys on bson.D and in bson/doc.go. Let me know what you think...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I prefer this for consistency.

//
//
kevinAlbs marked this conversation as resolved.
Show resolved Hide resolved
// The opts parameter can be used to specify options for the operation (see the options.InsertOneOptions documentation.)
//
Expand Down Expand Up @@ -348,7 +350,8 @@ func (coll *Collection) InsertOne(ctx context.Context, document interface{},
// The documents parameter must be a slice of documents to insert. The slice cannot be nil or empty. The elements must
// all be non-nil. For any document that does not have an _id field when transformed into BSON, one will be added
// automatically to the marshalled document. The original document will not be modified. The _id values for the inserted
// documents can be retrieved from the InsertedIDs field of the returned InsertManyResult.
// documents can be retrieved from the InsertedIDs field of the returned InsertManyResult. No single document in the
// documents parameter should contain duplicate key names, as that can result in undefined behavior from the server.
//
// The opts parameter can be used to specify options for the operation (see the options.InsertManyOptions documentation.)
//
Expand Down