From 9b2a5215d47e2d35fb8d5dd26f63ef9a5f0eb88a Mon Sep 17 00:00:00 2001 From: Luis Nieto Date: Fri, 25 Jun 2021 20:57:55 -0500 Subject: [PATCH 1/3] Refactor to (almost) not use bsonx package Removed the cases where it checks/creates a bsonx.Doc, and replaced them with bson.D type if necessary. Removed functions that seemed only to transform bsonx to another type. Removed a test for an specific function for the same reason. The bsonx package is largely replaced by bson and bsoncore. bsonx was a proof of concept, and it should be completely replaced. There is still various places that use bsonx: - benchmark directory - mongo/gridfs/bucket.go - mongo/gridfs/upload_stream.go - mongo/integration/collection_test.go - mongo/integration/gridfs_spec_test.go And a file inside the same bsonx package uses bsonx package: - x/bsonx/array.go --- .../documentation_examples/examples_test.go | 4 +- mongo/client_options_test.go | 4 +- mongo/database.go | 7 ++- mongo/gridfs/bucket.go | 31 +++++------ mongo/gridfs/upload_stream.go | 20 +++---- mongo/main_test.go | 7 +-- mongo/mongo.go | 25 ++++----- mongo/mongo_test.go | 53 +------------------ 8 files changed, 51 insertions(+), 100 deletions(-) diff --git a/examples/documentation_examples/examples_test.go b/examples/documentation_examples/examples_test.go index f6e9efd729..47f5071fbb 100644 --- a/examples/documentation_examples/examples_test.go +++ b/examples/documentation_examples/examples_test.go @@ -17,13 +17,13 @@ import ( "time" "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/examples/documentation_examples" "go.mongodb.org/mongo-driver/internal/testutil" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/description" "go.mongodb.org/mongo-driver/mongo/integration/mtest" "go.mongodb.org/mongo-driver/mongo/options" - "go.mongodb.org/mongo-driver/x/bsonx" "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" "go.mongodb.org/mongo-driver/x/mongo/driver/topology" ) @@ -174,7 +174,7 @@ func TestCausalConsistencyExamples(t *testing.T) { func getServerVersion(ctx context.Context, client *mongo.Client) (string, error) { serverStatus, err := client.Database("admin").RunCommand( ctx, - bsonx.Doc{{"serverStatus", bsonx.Int32(1)}}, + bson.D{{"serverStatus", 1}}, ).DecodeBytes() if err != nil { return "", err diff --git a/mongo/client_options_test.go b/mongo/client_options_test.go index 1fc4ef1102..6a85d4e78c 100644 --- a/mongo/client_options_test.go +++ b/mongo/client_options_test.go @@ -13,9 +13,9 @@ import ( "testing" "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/internal/testutil" "go.mongodb.org/mongo-driver/mongo/options" - "go.mongodb.org/mongo-driver/x/bsonx" ) func TestClientOptions_CustomDialer(t *testing.T) { @@ -27,7 +27,7 @@ func TestClientOptions_CustomDialer(t *testing.T) { require.NoError(t, err) err = client.Connect(context.Background()) require.NoError(t, err) - _, err = client.ListDatabases(context.Background(), bsonx.Doc{}) + _, err = client.ListDatabases(context.Background(), bson.D{}) require.NoError(t, err) got := atomic.LoadInt32(&td.called) if got < 1 { diff --git a/mongo/database.go b/mongo/database.go index b0066f04dc..030cb2ea5e 100644 --- a/mongo/database.go +++ b/mongo/database.go @@ -18,7 +18,6 @@ import ( "go.mongodb.org/mongo-driver/mongo/readconcern" "go.mongodb.org/mongo-driver/mongo/readpref" "go.mongodb.org/mongo-driver/mongo/writeconcern" - "go.mongodb.org/mongo-driver/x/bsonx" "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" "go.mongodb.org/mongo-driver/x/mongo/driver" "go.mongodb.org/mongo-driver/x/mongo/driver/operation" @@ -439,7 +438,7 @@ func (db *Database) ListCollectionNames(ctx context.Context, filter interface{}, names := make([]string, 0) for res.Next(ctx) { - next := &bsonx.Doc{} + next := &bsoncore.Document{} err = res.Decode(next) if err != nil { return nil, err @@ -450,8 +449,8 @@ func (db *Database) ListCollectionNames(ctx context.Context, filter interface{}, return nil, err } - if elem.Type() != bson.TypeString { - return nil, fmt.Errorf("incorrect type for 'name'. got %v. want %v", elem.Type(), bson.TypeString) + if elem.Type != bson.TypeString { + return nil, fmt.Errorf("incorrect type for 'name'. got %v. want %v", elem.Type, bson.TypeString) } elemName := elem.StringValue() diff --git a/mongo/gridfs/bucket.go b/mongo/gridfs/bucket.go index 697882c36c..952ae2fcbe 100644 --- a/mongo/gridfs/bucket.go +++ b/mongo/gridfs/bucket.go @@ -59,7 +59,7 @@ type Bucket struct { // Upload contains options to upload a file to a bucket. type Upload struct { chunkSize int32 - metadata bsonx.Doc + metadata bson.D } // NewBucket creates a GridFS bucket. @@ -190,7 +190,7 @@ func (b *Bucket) OpenDownloadStream(fileID interface{}) (*DownloadStream, error) if err != nil { return nil, err } - return b.openDownloadStream(bsonx.Doc{ + return b.openDownloadStream(bson.D{ {"_id", id}, }) } @@ -224,9 +224,9 @@ func (b *Bucket) OpenDownloadStreamByName(filename string, opts ...*options.Name numSkip = (-1 * numSkip) - 1 } - findOpts := options.Find().SetSkip(int64(numSkip)).SetSort(bsonx.Doc{{"uploadDate", bsonx.Int32(sortOrder)}}) + findOpts := options.Find().SetSkip(int64(numSkip)).SetSort(bson.D{{"uploadDate", sortOrder}}) - return b.openDownloadStream(bsonx.Doc{{"filename", bsonx.String(filename)}}, findOpts) + return b.openDownloadStream(bson.D{{"filename", filename}}, findOpts) } // DownloadToStreamByName downloads the file with the given name to the given io.Writer. @@ -258,7 +258,7 @@ func (b *Bucket) Delete(fileID interface{}) error { if err != nil { return err } - res, err := b.filesColl.DeleteOne(ctx, bsonx.Doc{{"_id", id}}) + res, err := b.filesColl.DeleteOne(ctx, bson.D{{"_id", id}}) if err == nil && res.DeletedCount == 0 { err = ErrFileNotFound } @@ -322,8 +322,8 @@ func (b *Bucket) Rename(fileID interface{}, newFilename string) error { return err } res, err := b.filesColl.UpdateOne(ctx, - bsonx.Doc{{"_id", id}}, - bsonx.Doc{{"$set", bsonx.Document(bsonx.Doc{{"filename", bsonx.String(newFilename)}})}}, + bson.D{{"_id", id}}, + bson.D{{"$set", bson.D{{"filename", newFilename}}}}, ) if err != nil { return err @@ -430,7 +430,7 @@ func (b *Bucket) deleteChunks(ctx context.Context, fileID interface{}) error { if err != nil { return err } - _, err = b.chunksColl.DeleteMany(ctx, bsonx.Doc{{"files_id", id}}) + _, err = b.chunksColl.DeleteMany(ctx, bson.D{{"files_id", id}}) return err } @@ -454,8 +454,8 @@ func (b *Bucket) findChunks(ctx context.Context, fileID interface{}) (*mongo.Cur return nil, err } chunksCursor, err := b.chunksColl.Find(ctx, - bsonx.Doc{{"files_id", id}}, - options.Find().SetSort(bsonx.Doc{{"n", bsonx.Int32(1)}})) // sort by chunk index + bson.D{{"files_id", id}}, + options.Find().SetSort(bson.D{{"n", 1}})) // sort by chunk index if err != nil { return nil, err } @@ -550,7 +550,7 @@ func (b *Bucket) createIndexes(ctx context.Context) error { return err } - docRes := cloned.FindOne(ctx, bsonx.Doc{}, options.FindOne().SetProjection(bsonx.Doc{{"_id", bsonx.Int32(1)}})) + docRes := cloned.FindOne(ctx, bson.D{}, options.FindOne().SetProjection(bson.D{{"_id", 1}})) _, err = docRes.DecodeBytes() if err != mongo.ErrNoDocuments { @@ -617,11 +617,12 @@ func (b *Bucket) parseUploadOptions(opts ...*options.UploadOptions) (*Upload, er if err != nil { return nil, err } - doc, err := bsonx.ReadDoc(raw) - if err != nil { - return nil, err + doc := &bson.D{} + unMarErr := bson.UnmarshalWithRegistry(uo.Registry, raw, doc) + if unMarErr != nil { + return nil, unMarErr } - upload.metadata = doc + upload.metadata = *doc } return upload, nil diff --git a/mongo/gridfs/upload_stream.go b/mongo/gridfs/upload_stream.go index 783e965751..7fb9e34e44 100644 --- a/mongo/gridfs/upload_stream.go +++ b/mongo/gridfs/upload_stream.go @@ -14,6 +14,7 @@ import ( "math" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/x/bsonx" @@ -141,7 +142,7 @@ func (us *UploadStream) Abort() error { if err != nil { return err } - _, err = us.chunksColl.DeleteMany(ctx, bsonx.Doc{{"files_id", id}}) + _, err = us.chunksColl.DeleteMany(ctx, bson.D{{"files_id", id}}) if err != nil { return err } @@ -178,11 +179,12 @@ func (us *UploadStream) uploadChunks(ctx context.Context, uploadPartial bool) er endIndex = us.bufferIndex } chunkData := us.buffer[i:endIndex] - docs[us.chunkIndex-begChunkIndex] = bsonx.Doc{ - {"_id", bsonx.ObjectID(primitive.NewObjectID())}, + docs[us.chunkIndex-begChunkIndex] = bson.D{ + {"_id", primitive.NewObjectID()}, {"files_id", id}, - {"n", bsonx.Int32(int32(us.chunkIndex))}, + {"n", int32(us.chunkIndex)}, {"data", bsonx.Binary(0x00, chunkData)}, + // {"data", bsoncore.BuildDocumentValue(chunkData)}, } us.chunkIndex++ us.fileLen += int64(len(chunkData)) @@ -207,16 +209,16 @@ func (us *UploadStream) createFilesCollDoc(ctx context.Context) error { if err != nil { return err } - doc := bsonx.Doc{ + doc := bson.D{ {"_id", id}, - {"length", bsonx.Int64(us.fileLen)}, - {"chunkSize", bsonx.Int32(us.chunkSize)}, + {"length", us.fileLen}, + {"chunkSize", us.chunkSize}, {"uploadDate", bsonx.DateTime(time.Now().UnixNano() / int64(time.Millisecond))}, - {"filename", bsonx.String(us.filename)}, + {"filename", us.filename}, } if us.metadata != nil { - doc = append(doc, bsonx.Elem{"metadata", bsonx.Document(us.metadata)}) + doc = append(doc, bson.E{"metadata", us.metadata}) } _, err = us.filesColl.InsertOne(ctx, doc) diff --git a/mongo/main_test.go b/mongo/main_test.go index 38c6733526..c4ca209262 100644 --- a/mongo/main_test.go +++ b/mongo/main_test.go @@ -12,12 +12,13 @@ import ( "testing" "github.com/google/go-cmp/cmp" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/internal/testutil/assert" "go.mongodb.org/mongo-driver/mongo/readconcern" "go.mongodb.org/mongo-driver/mongo/readpref" "go.mongodb.org/mongo-driver/mongo/writeconcern" - "go.mongodb.org/mongo-driver/x/bsonx" + "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" ) func TestMain(m *testing.M) { @@ -32,8 +33,8 @@ func TestMain(m *testing.M) { assert.RegisterOpts(reflect.TypeOf(&readconcern.ReadConcern{}), cmp.AllowUnexported(readconcern.ReadConcern{})) assert.RegisterOpts(reflect.TypeOf(&writeconcern.WriteConcern{}), cmp.AllowUnexported(writeconcern.WriteConcern{})) assert.RegisterOpts(reflect.TypeOf(&readpref.ReadPref{}), cmp.AllowUnexported(readpref.ReadPref{})) - assert.RegisterOpts(reflect.TypeOf(bsonx.Doc{}), cmp.AllowUnexported(bsonx.Elem{}, bsonx.Val{})) - assert.RegisterOpts(reflect.TypeOf(bsonx.Arr{}), cmp.AllowUnexported(bsonx.Val{})) + assert.RegisterOpts(reflect.TypeOf(bson.D{}), cmp.AllowUnexported(bson.E{}, bsoncore.Value{})) + assert.RegisterOpts(reflect.TypeOf(bson.A{}), cmp.AllowUnexported(bsoncore.Value{})) os.Exit(m.Run()) } diff --git a/mongo/mongo.go b/mongo/mongo.go index da29175c11..8f06a557da 100644 --- a/mongo/mongo.go +++ b/mongo/mongo.go @@ -16,7 +16,6 @@ import ( "strings" "go.mongodb.org/mongo-driver/mongo/options" - "go.mongodb.org/mongo-driver/x/bsonx" "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" "go.mongodb.org/mongo-driver/bson" @@ -81,8 +80,6 @@ func transformAndEnsureID(registry *bsoncodec.Registry, val interface{}) (bsonco switch tt := val.(type) { case nil: return nil, nil, ErrNilDocument - case bsonx.Doc: - val = tt.Copy() case []byte: // Slight optimization so we'll just use MarshalBSON and not go through the codec machinery. val = bson.Raw(tt) @@ -123,16 +120,16 @@ func transformAndEnsureID(registry *bsoncodec.Registry, val interface{}) (bsonco return doc, id, nil } -func transformDocument(registry *bsoncodec.Registry, val interface{}) (bsonx.Doc, error) { - if doc, ok := val.(bsonx.Doc); ok { - return doc.Copy(), nil - } - b, err := transformBsoncoreDocument(registry, val, true, "document") - if err != nil { - return nil, err - } - return bsonx.ReadDoc(b) -} +// func transformDocument(registry *bsoncodec.Registry, val interface{}) (bsoncore.Document, error) { +// // if doc, ok := val.(bsonx.Doc); ok { +// // return doc.Copy(), nil +// // } +// b, err := transformBsoncoreDocument(registry, val, true, "document") +// if err != nil { +// return nil, err +// } +// return b, nil +// } func transformBsoncoreDocument(registry *bsoncodec.Registry, val interface{}, mapAllowed bool, paramName string) (bsoncore.Document, error) { if registry == nil { @@ -276,7 +273,7 @@ func transformUpdateValue(registry *bsoncodec.Registry, update interface{}, doll switch t := update.(type) { case nil: return u, ErrNilDocument - case primitive.D, bsonx.Doc: + case primitive.D: u.Type = bsontype.EmbeddedDocument u.Data, err = transformBsoncoreDocument(registry, update, true, "update") if err != nil { diff --git a/mongo/mongo_test.go b/mongo/mongo_test.go index 6744aacd8d..eda02fbe42 100644 --- a/mongo/mongo_test.go +++ b/mongo/mongo_test.go @@ -16,59 +16,10 @@ import ( "go.mongodb.org/mongo-driver/bson/bsontype" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/internal/testutil/assert" - "go.mongodb.org/mongo-driver/x/bsonx" "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" ) func TestMongoHelpers(t *testing.T) { - t.Run("transform document", func(t *testing.T) { - testCases := []struct { - name string - document interface{} - want bsonx.Doc - err error - }{ - { - "bson.Marshaler", - bMarsh{bsonx.Doc{{"foo", bsonx.String("bar")}}}, - bsonx.Doc{{"foo", bsonx.String("bar")}}, - nil, - }, - { - "reflection", - reflectStruct{Foo: "bar"}, - bsonx.Doc{{"foo", bsonx.String("bar")}}, - nil, - }, - { - "reflection pointer", - &reflectStruct{Foo: "bar"}, - bsonx.Doc{{"foo", bsonx.String("bar")}}, - nil, - }, - { - "unsupported type", - []string{"foo", "bar"}, - nil, - MarshalError{ - Value: []string{"foo", "bar"}, - Err: errors.New("WriteArray can only write a Array while positioned on a Element or Value but is positioned on a TopLevel")}, - }, - { - "nil", - nil, - nil, - ErrNilDocument, - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - got, err := transformDocument(bson.NewRegistryBuilder().Build(), tc.document) - assert.Equal(t, tc.err, err, "expected error %v, got %v", tc.err, err) - assert.Equal(t, tc.want, got, "expected document %v, got %v", tc.want, got) - }) - } - }) t.Run("transform and ensure ID", func(t *testing.T) { t.Run("newly added _id should be first element", func(t *testing.T) { doc := bson.D{{"foo", "bar"}, {"baz", "qux"}, {"hello", "world"}} @@ -511,11 +462,11 @@ func TestMongoHelpers(t *testing.T) { var _ bson.Marshaler = bMarsh{} type bMarsh struct { - bsonx.Doc + bson.D } func (b bMarsh) MarshalBSON() ([]byte, error) { - return b.Doc.MarshalBSON() + return bson.Marshal(b) } type reflectStruct struct { From 8ce29c59176d35d638a7dd7e2ab68b83a53b4c30 Mon Sep 17 00:00:00 2001 From: Matt Dale <9760375+matthewdale@users.noreply.github.com> Date: Wed, 30 Mar 2022 15:01:59 -0700 Subject: [PATCH 2/3] Remove remaining bsonx usage in production code; don't drop handling of bsonx.Doc --- mongo/database.go | 8 +----- mongo/gridfs/bucket.go | 50 ++++------------------------------- mongo/gridfs/upload_stream.go | 28 +++++--------------- mongo/mongo.go | 16 +++-------- mongo/mongo_test.go | 14 ---------- 5 files changed, 17 insertions(+), 99 deletions(-) diff --git a/mongo/database.go b/mongo/database.go index 030cb2ea5e..6a5d02610f 100644 --- a/mongo/database.go +++ b/mongo/database.go @@ -438,13 +438,7 @@ func (db *Database) ListCollectionNames(ctx context.Context, filter interface{}, names := make([]string, 0) for res.Next(ctx) { - next := &bsoncore.Document{} - err = res.Decode(next) - if err != nil { - return nil, err - } - - elem, err := next.LookupErr("name") + elem, err := res.Current.LookupErr("name") if err != nil { return nil, err } diff --git a/mongo/gridfs/bucket.go b/mongo/gridfs/bucket.go index 952ae2fcbe..57296db30e 100644 --- a/mongo/gridfs/bucket.go +++ b/mongo/gridfs/bucket.go @@ -21,7 +21,6 @@ import ( "go.mongodb.org/mongo-driver/mongo/readconcern" "go.mongodb.org/mongo-driver/mongo/readpref" "go.mongodb.org/mongo-driver/mongo/writeconcern" - "go.mongodb.org/mongo-driver/x/bsonx" "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" ) @@ -186,12 +185,8 @@ func (b *Bucket) UploadFromStreamWithID(fileID interface{}, filename string, sou // OpenDownloadStream creates a stream from which the contents of the file can be read. func (b *Bucket) OpenDownloadStream(fileID interface{}) (*DownloadStream, error) { - id, err := convertFileID(fileID) - if err != nil { - return nil, err - } return b.openDownloadStream(bson.D{ - {"_id", id}, + {"_id", fileID}, }) } @@ -254,11 +249,7 @@ func (b *Bucket) Delete(fileID interface{}) error { defer cancel() } - id, err := convertFileID(fileID) - if err != nil { - return err - } - res, err := b.filesColl.DeleteOne(ctx, bson.D{{"_id", id}}) + res, err := b.filesColl.DeleteOne(ctx, bson.D{{"_id", fileID}}) if err == nil && res.DeletedCount == 0 { err = ErrFileNotFound } @@ -317,12 +308,8 @@ func (b *Bucket) Rename(fileID interface{}, newFilename string) error { defer cancel() } - id, err := convertFileID(fileID) - if err != nil { - return err - } res, err := b.filesColl.UpdateOne(ctx, - bson.D{{"_id", id}}, + bson.D{{"_id", fileID}}, bson.D{{"$set", bson.D{{"filename", newFilename}}}}, ) if err != nil { @@ -426,11 +413,7 @@ func (b *Bucket) downloadToStream(ds *DownloadStream, stream io.Writer) (int64, } func (b *Bucket) deleteChunks(ctx context.Context, fileID interface{}) error { - id, err := convertFileID(fileID) - if err != nil { - return err - } - _, err = b.chunksColl.DeleteMany(ctx, bson.D{{"files_id", id}}) + _, err := b.chunksColl.DeleteMany(ctx, bson.D{{"files_id", fileID}}) return err } @@ -449,12 +432,8 @@ func (b *Bucket) findFile(ctx context.Context, filter interface{}, opts ...*opti } func (b *Bucket) findChunks(ctx context.Context, fileID interface{}) (*mongo.Cursor, error) { - id, err := convertFileID(fileID) - if err != nil { - return nil, err - } chunksCursor, err := b.chunksColl.Find(ctx, - bson.D{{"files_id", id}}, + bson.D{{"files_id", fileID}}, options.Find().SetSort(bson.D{{"n", 1}})) // sort by chunk index if err != nil { return nil, err @@ -627,22 +606,3 @@ func (b *Bucket) parseUploadOptions(opts ...*options.UploadOptions) (*Upload, er return upload, nil } - -type _convertFileID struct { - ID interface{} `bson:"_id"` -} - -func convertFileID(fileID interface{}) (bsonx.Val, error) { - id := _convertFileID{ - ID: fileID, - } - - b, err := bson.Marshal(id) - if err != nil { - return bsonx.Val{}, err - } - val := bsoncore.Document(b).Lookup("_id") - var res bsonx.Val - err = res.UnmarshalBSONValue(val.Type, val.Data) - return res, err -} diff --git a/mongo/gridfs/upload_stream.go b/mongo/gridfs/upload_stream.go index 7fb9e34e44..cf1997db80 100644 --- a/mongo/gridfs/upload_stream.go +++ b/mongo/gridfs/upload_stream.go @@ -17,7 +17,6 @@ import ( "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/x/bsonx" ) // UploadBufferSize is the size in bytes of one stream batch. Chunks will be written to the db after the sum of chunk @@ -138,11 +137,7 @@ func (us *UploadStream) Abort() error { defer cancel() } - id, err := convertFileID(us.FileID) - if err != nil { - return err - } - _, err = us.chunksColl.DeleteMany(ctx, bson.D{{"files_id", id}}) + _, err := us.chunksColl.DeleteMany(ctx, bson.D{{"files_id", us.FileID}}) if err != nil { return err } @@ -164,10 +159,6 @@ func (us *UploadStream) uploadChunks(ctx context.Context, uploadPartial bool) er docs := make([]interface{}, numChunks) - id, err := convertFileID(us.FileID) - if err != nil { - return err - } begChunkIndex := us.chunkIndex for i := 0; i < us.bufferIndex; i += int(us.chunkSize) { endIndex := i + int(us.chunkSize) @@ -181,16 +172,15 @@ func (us *UploadStream) uploadChunks(ctx context.Context, uploadPartial bool) er chunkData := us.buffer[i:endIndex] docs[us.chunkIndex-begChunkIndex] = bson.D{ {"_id", primitive.NewObjectID()}, - {"files_id", id}, + {"files_id", us.FileID}, {"n", int32(us.chunkIndex)}, - {"data", bsonx.Binary(0x00, chunkData)}, - // {"data", bsoncore.BuildDocumentValue(chunkData)}, + {"data", primitive.Binary{Subtype: 0x00, Data: chunkData}}, } us.chunkIndex++ us.fileLen += int64(len(chunkData)) } - _, err = us.chunksColl.InsertMany(ctx, docs) + _, err := us.chunksColl.InsertMany(ctx, docs) if err != nil { return err } @@ -205,15 +195,11 @@ func (us *UploadStream) uploadChunks(ctx context.Context, uploadPartial bool) er } func (us *UploadStream) createFilesCollDoc(ctx context.Context) error { - id, err := convertFileID(us.FileID) - if err != nil { - return err - } doc := bson.D{ - {"_id", id}, + {"_id", us.FileID}, {"length", us.fileLen}, {"chunkSize", us.chunkSize}, - {"uploadDate", bsonx.DateTime(time.Now().UnixNano() / int64(time.Millisecond))}, + {"uploadDate", primitive.DateTime(time.Now().UnixNano() / int64(time.Millisecond))}, {"filename", us.filename}, } @@ -221,7 +207,7 @@ func (us *UploadStream) createFilesCollDoc(ctx context.Context) error { doc = append(doc, bson.E{"metadata", us.metadata}) } - _, err = us.filesColl.InsertOne(ctx, doc) + _, err := us.filesColl.InsertOne(ctx, doc) if err != nil { return err } diff --git a/mongo/mongo.go b/mongo/mongo.go index 8f06a557da..80282527e4 100644 --- a/mongo/mongo.go +++ b/mongo/mongo.go @@ -16,6 +16,7 @@ import ( "strings" "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/x/bsonx" "go.mongodb.org/mongo-driver/x/bsonx/bsoncore" "go.mongodb.org/mongo-driver/bson" @@ -80,6 +81,8 @@ func transformAndEnsureID(registry *bsoncodec.Registry, val interface{}) (bsonco switch tt := val.(type) { case nil: return nil, nil, ErrNilDocument + case bsonx.Doc: + val = tt.Copy() case []byte: // Slight optimization so we'll just use MarshalBSON and not go through the codec machinery. val = bson.Raw(tt) @@ -120,17 +123,6 @@ func transformAndEnsureID(registry *bsoncodec.Registry, val interface{}) (bsonco return doc, id, nil } -// func transformDocument(registry *bsoncodec.Registry, val interface{}) (bsoncore.Document, error) { -// // if doc, ok := val.(bsonx.Doc); ok { -// // return doc.Copy(), nil -// // } -// b, err := transformBsoncoreDocument(registry, val, true, "document") -// if err != nil { -// return nil, err -// } -// return b, nil -// } - func transformBsoncoreDocument(registry *bsoncodec.Registry, val interface{}, mapAllowed bool, paramName string) (bsoncore.Document, error) { if registry == nil { registry = bson.DefaultRegistry @@ -273,7 +265,7 @@ func transformUpdateValue(registry *bsoncodec.Registry, update interface{}, doll switch t := update.(type) { case nil: return u, ErrNilDocument - case primitive.D: + case primitive.D, bsonx.Doc: u.Type = bsontype.EmbeddedDocument u.Data, err = transformBsoncoreDocument(registry, update, true, "update") if err != nil { diff --git a/mongo/mongo_test.go b/mongo/mongo_test.go index eda02fbe42..486c3d9818 100644 --- a/mongo/mongo_test.go +++ b/mongo/mongo_test.go @@ -459,20 +459,6 @@ func TestMongoHelpers(t *testing.T) { }) } -var _ bson.Marshaler = bMarsh{} - -type bMarsh struct { - bson.D -} - -func (b bMarsh) MarshalBSON() ([]byte, error) { - return bson.Marshal(b) -} - -type reflectStruct struct { - Foo string -} - var _ bsoncodec.ValueMarshaler = bvMarsh{} type bvMarsh struct { From 6386fb98e2f4ab486018f6bcd06e2a54db3abf8a Mon Sep 17 00:00:00 2001 From: Matt Dale <9760375+matthewdale@users.noreply.github.com> Date: Wed, 6 Apr 2022 18:06:23 -0700 Subject: [PATCH 3/3] Simplify marshal/unmarshal clone of bucket metadata. --- mongo/gridfs/bucket.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mongo/gridfs/bucket.go b/mongo/gridfs/bucket.go index 57296db30e..e4e2d35bda 100644 --- a/mongo/gridfs/bucket.go +++ b/mongo/gridfs/bucket.go @@ -596,12 +596,12 @@ func (b *Bucket) parseUploadOptions(opts ...*options.UploadOptions) (*Upload, er if err != nil { return nil, err } - doc := &bson.D{} - unMarErr := bson.UnmarshalWithRegistry(uo.Registry, raw, doc) + var doc bson.D + unMarErr := bson.UnmarshalWithRegistry(uo.Registry, raw, &doc) if unMarErr != nil { return nil, unMarErr } - upload.metadata = *doc + upload.metadata = doc } return upload, nil