@@ -2481,3 +2481,73 @@ func exportAndImportWithQuery(
24812481 require .NoError (t , err )
24822482 return n
24832483}
2484+
2485+ // TestRoundTripSortAndSkip verifies that mongoexport --sort and --skip
2486+ // correctly affect which documents are exported (from sort_and_skip.js).
2487+ func TestRoundTripSortAndSkip (t * testing.T ) {
2488+ testtype .SkipUnlessTestType (t , testtype .IntegrationTestType )
2489+
2490+ const dbName = "mongoimport_roundtrip_sortskip_test"
2491+ const collName = "data"
2492+
2493+ sessionProvider , _ , err := testutil .GetBareSessionProvider ()
2494+ require .NoError (t , err )
2495+ client , err := sessionProvider .GetSession ()
2496+ require .NoError (t , err )
2497+ t .Cleanup (func () {
2498+ if err := client .Database (dbName ).Drop (context .Background ()); err != nil {
2499+ t .Errorf ("dropping test database: %v" , err )
2500+ }
2501+ })
2502+
2503+ coll := client .Database (dbName ).Collection (collName )
2504+ docs := make ([]any , 50 )
2505+ for i := range 50 {
2506+ docs [i ] = bson.D {{"a" , int32 (i )}}
2507+ }
2508+ _ , err = coll .InsertMany (t .Context (), docs )
2509+ require .NoError (t , err )
2510+
2511+ exportToolOptions , err := testutil .GetToolOptions ()
2512+ require .NoError (t , err )
2513+ exportToolOptions .Namespace = & options.Namespace {DB : dbName , Collection : collName }
2514+ me , err := mongoexport .New (mongoexport.Options {
2515+ ToolOptions : exportToolOptions ,
2516+ OutputFormatOptions : & mongoexport.OutputFormatOptions {
2517+ Type : "json" , JSONFormat : "relaxed" ,
2518+ },
2519+ InputOptions : & mongoexport.InputOptions {Sort : "{a:1}" , Skip : 20 },
2520+ })
2521+ require .NoError (t , err )
2522+ defer me .Close ()
2523+ tmpFile , err := os .CreateTemp (t .TempDir (), "export-*.json" )
2524+ require .NoError (t , err )
2525+ n , err := me .Export (tmpFile )
2526+ require .NoError (t , err )
2527+ require .NoError (t , tmpFile .Close ())
2528+ assert .EqualValues (t , 30 , n , "should export 30 documents after skipping 20" )
2529+
2530+ require .NoError (t , coll .Drop (t .Context ()))
2531+
2532+ importToolOptions , err := testutil .GetToolOptions ()
2533+ require .NoError (t , err )
2534+ importToolOptions .Namespace = & options.Namespace {DB : dbName , Collection : collName }
2535+ mi , err := New (Options {
2536+ ToolOptions : importToolOptions ,
2537+ InputOptions : & InputOptions {File : tmpFile .Name (), ParseGrace : "stop" },
2538+ IngestOptions : & IngestOptions {},
2539+ })
2540+ require .NoError (t , err )
2541+ imported , _ , err := mi .ImportDocuments ()
2542+ require .NoError (t , err )
2543+ assert .EqualValues (t , 30 , imported , "should import all 30 exported documents" )
2544+
2545+ count , err := coll .CountDocuments (t .Context (), bson.D {})
2546+ require .NoError (t , err )
2547+ assert .EqualValues (t , 30 , count , "collection should have 30 documents" )
2548+ for i := range int32 (30 ) {
2549+ c , err := coll .CountDocuments (t .Context (), bson.D {{"a" , i + 20 }})
2550+ require .NoError (t , err )
2551+ assert .EqualValues (t , 1 , c , "document with a=%d should exist" , i + 20 )
2552+ }
2553+ }
0 commit comments