@@ -20,6 +20,9 @@ import (
20
20
"github.com/stretchr/testify/require"
21
21
"go.mongodb.org/mongo-driver/bson"
22
22
"go.mongodb.org/mongo-driver/bson/primitive"
23
+ "go.mongodb.org/mongo-driver/mongo"
24
+
25
+ "github.com/qiniu/qmgo/operator"
23
26
)
24
27
25
28
type QueryTestItem struct {
@@ -563,3 +566,136 @@ func TestQuery_Cursor(t *testing.T) {
563
566
cursor = cli .Find (context .Background (), filter3 ).Cursor ()
564
567
ast .Error (cursor .Err ())
565
568
}
569
+
570
+ func TestQuery_Apply (t * testing.T ) {
571
+ ast := require .New (t )
572
+ cli := initClient ("test" )
573
+ defer cli .Close (context .Background ())
574
+ defer cli .DropCollection (context .Background ())
575
+ cli .EnsureIndexes (context .Background (), nil , []string {"name" })
576
+
577
+ id1 := primitive .NewObjectID ()
578
+ id2 := primitive .NewObjectID ()
579
+ id3 := primitive .NewObjectID ()
580
+ docs := []interface {}{
581
+ bson.M {"_id" : id1 , "name" : "Alice" , "age" : 18 },
582
+ bson.M {"_id" : id2 , "name" : "Alice" , "age" : 19 },
583
+ bson.M {"_id" : id3 , "name" : "Lucas" , "age" : 20 },
584
+ }
585
+ _ , _ = cli .InsertMany (context .Background (), docs )
586
+
587
+ var err error
588
+ res1 := QueryTestItem {}
589
+ filter1 := bson.M {
590
+ "name" : "Tom" ,
591
+ }
592
+ change1 := Change {
593
+ }
594
+
595
+ err = cli .Find (context .Background (), filter1 ).Apply (change1 , & res1 )
596
+ ast .EqualError (err , mongo .ErrNilDocument .Error ())
597
+
598
+ change1 .Update = bson.M {
599
+ operator .Set : bson.M {
600
+ "name" : "Tom" ,
601
+ "age" : 18 ,
602
+ },
603
+ }
604
+ err = cli .Find (context .Background (), filter1 ).Apply (change1 , & res1 )
605
+ ast .EqualError (err , mongo .ErrNoDocuments .Error ())
606
+
607
+ change1 .ReturnNew = true
608
+ err = cli .Find (context .Background (), filter1 ).Apply (change1 , & res1 )
609
+ ast .EqualError (err , mongo .ErrNoDocuments .Error ())
610
+
611
+ change1 .Upsert = true
612
+ err = cli .Find (context .Background (), filter1 ).Apply (change1 , & res1 )
613
+ ast .NoError (err )
614
+ ast .Equal ( "Tom" , res1 .Name )
615
+ ast .Equal (18 , res1 .Age )
616
+
617
+ res2 := QueryTestItem {}
618
+ filter2 := bson.M {
619
+ "name" : "Alice" ,
620
+ }
621
+ change2 := Change {
622
+ ReturnNew : true ,
623
+ Update : bson.M {
624
+ operator .Set : bson.M {
625
+ "name" : "Alice" ,
626
+ "age" : 22 ,
627
+ },
628
+ },
629
+ }
630
+ projection2 := bson.M {
631
+ "age" : 1 ,
632
+ }
633
+ err = cli .Find (context .Background (), filter2 ).Sort ("age" ).Select (projection2 ).Apply (change2 , & res2 )
634
+ ast .NoError (err )
635
+ ast .Equal ("" , res2 .Name )
636
+ ast .Equal (22 , res2 .Age )
637
+
638
+ res3 := QueryTestItem {}
639
+ filter3 := bson.M {
640
+ "name" : "Bob" ,
641
+ }
642
+ change3 := Change {
643
+ Remove : true ,
644
+ }
645
+ err = cli .Find (context .Background (), filter3 ).Apply (change3 , & res3 )
646
+ ast .EqualError (err , mongo .ErrNoDocuments .Error ())
647
+
648
+ res3 = QueryTestItem {}
649
+ filter3 = bson.M {
650
+ "name" : "Alice" ,
651
+ }
652
+ projection3 := bson.M {
653
+ "age" : 1 ,
654
+ }
655
+ err = cli .Find (context .Background (), filter3 ).Sort ("age" ).Select (projection3 ).Apply (change3 , & res3 )
656
+ ast .NoError (err )
657
+ ast .Equal ("" , res3 .Name )
658
+ ast .Equal (19 , res3 .Age )
659
+
660
+ res4 := QueryTestItem {}
661
+ filter4 := bson.M {
662
+ "name" : "Bob" ,
663
+ }
664
+ change4 := Change {
665
+ Replace : true ,
666
+ Update : bson.M {
667
+ operator .Set : bson.M {
668
+ "name" : "Bob" ,
669
+ "age" : 23 ,
670
+ },
671
+ },
672
+ }
673
+ err = cli .Find (context .Background (), filter4 ).Apply (change4 , & res4 )
674
+ ast .EqualError (err , ErrReplacementContainUpdateOperators .Error ())
675
+
676
+ change4 .Update = bson.M {"name" : "Bob" , "age" : 23 }
677
+ err = cli .Find (context .Background (), filter4 ).Apply (change4 , & res4 )
678
+ ast .EqualError (err , mongo .ErrNoDocuments .Error ())
679
+
680
+ change4 .Upsert = true
681
+ change4 .ReturnNew = true
682
+ err = cli .Find (context .Background (), filter4 ).Apply (change4 , & res4 )
683
+ ast .NoError (err )
684
+ ast .Equal ("Bob" , res4 .Name )
685
+ ast .Equal (23 , res4 .Age )
686
+
687
+ change4 = Change {
688
+ Replace : true ,
689
+ Update : bson.M {"name" : "Bob" , "age" : 25 },
690
+ Upsert : true ,
691
+ ReturnNew : false ,
692
+ }
693
+ projection4 := bson.M {
694
+ "age" : 1 ,
695
+ "name" : 1 ,
696
+ }
697
+ err = cli .Find (context .Background (), filter4 ).Sort ("age" ).Select (projection4 ).Apply (change4 , & res4 )
698
+ ast .NoError (err )
699
+ ast .Equal ("Bob" , res4 .Name )
700
+ ast .Equal (23 , res4 .Age )
701
+ }
0 commit comments