@@ -452,6 +452,47 @@ func (b *Bucket) findChunks(ctx context.Context, fileID interface{}) (*mongo.Cur
452
452
return chunksCursor , nil
453
453
}
454
454
455
+ // returns true if the 2 index documents are equal
456
+ func indexDocsEqual (expected , actual bsoncore.Document ) (bool , error ) {
457
+ if bytes .Equal (expected , actual ) {
458
+ return true , nil
459
+ }
460
+
461
+ keyElemElems , err := actual .Elements ()
462
+ if err != nil {
463
+ return false , err
464
+ }
465
+ modelKeysElems , err := expected .Elements ()
466
+ if err != nil {
467
+ return false , err
468
+ }
469
+
470
+ if len (keyElemElems ) != len (modelKeysElems ) {
471
+ return false , nil
472
+ }
473
+
474
+ for _ , elem := range keyElemElems {
475
+ key := elem .Key ()
476
+ modelVal , err := expected .LookupErr (key )
477
+ if err != nil {
478
+ return false , nil
479
+ }
480
+
481
+ val := elem .Value ()
482
+ if ! val .IsNumber () || ! modelVal .IsNumber () {
483
+ if val .Equal (modelVal ) {
484
+ continue
485
+ }
486
+ return false , nil
487
+ }
488
+
489
+ if val .AsInt64 () != modelVal .AsInt64 () {
490
+ return false , nil
491
+ }
492
+ }
493
+ return true , nil
494
+ }
495
+
455
496
// Create an index if it doesn't already exist
456
497
func createIndexIfNotExists (ctx context.Context , iv mongo.IndexView , model mongo.IndexModel ) error {
457
498
c , err := iv .List (ctx )
@@ -462,66 +503,25 @@ func createIndexIfNotExists(ctx context.Context, iv mongo.IndexView, model mongo
462
503
_ = c .Close (ctx )
463
504
}()
464
505
506
+ modelKeysBytes , err := bson .Marshal (model .Keys )
507
+ if err != nil {
508
+ return err
509
+ }
510
+ modelKeysDoc := bsoncore .Document (modelKeysBytes )
511
+
465
512
var found bool
466
- for c .Next (ctx ) {
513
+ for c .Next (ctx ) && ! found {
467
514
keyElem , err := c .Current .LookupErr ("key" )
468
515
if err != nil {
469
516
return err
470
517
}
471
518
472
519
keyElemDoc := bsoncore.Value {Type : keyElem .Type , Data : keyElem .Value }.Document ()
473
520
474
- modelKeysBytes , err := bson . Marshal ( model . Keys )
521
+ found , err = indexDocsEqual ( modelKeysDoc , keyElemDoc )
475
522
if err != nil {
476
523
return err
477
524
}
478
- modelKeysDoc := bsoncore .Document (modelKeysBytes )
479
-
480
- if bytes .Equal (modelKeysDoc , keyElemDoc ) {
481
- found = true
482
- break
483
- }
484
-
485
- keyElemElems , err := keyElemDoc .Elements ()
486
- if err != nil {
487
- return err
488
- }
489
- modelKeysElems , err := modelKeysDoc .Elements ()
490
- if err != nil {
491
- return err
492
- }
493
-
494
- if len (keyElemElems ) != len (modelKeysElems ) {
495
- continue
496
- }
497
-
498
- docsEqual := true
499
- for _ , elem := range keyElemElems {
500
- key := elem .Key ()
501
- modelVal , err := modelKeysDoc .LookupErr (key )
502
- if err != nil {
503
- docsEqual = false
504
- break
505
- }
506
-
507
- val := elem .Value ()
508
- if ! val .IsNumber () || ! modelVal .IsNumber () {
509
- if val .Equal (modelVal ) {
510
- continue
511
- }
512
- docsEqual = false
513
- break
514
- }
515
-
516
- if val .AsInt64 () != modelVal .AsInt64 () {
517
- docsEqual = false
518
- break
519
- }
520
- }
521
- if docsEqual {
522
- found = true
523
- break
524
- }
525
525
}
526
526
527
527
if ! found {
0 commit comments