@@ -1797,3 +1797,92 @@ func TestRoundTripViewExport(t *testing.T) {
17971797 require .NoError (t , err )
17981798 assert .EqualValues (t , 4 , n , "restored view should have correct number of rows" )
17991799}
1800+
1801+ // TestRoundTripFieldFile verifies that mongoexport --fieldFile limits exported
1802+ // fields, and that mongoimport correctly restores the filtered data (from field_file.js).
1803+ func TestRoundTripFieldFile (t * testing.T ) {
1804+ testtype .SkipUnlessTestType (t , testtype .IntegrationTestType )
1805+
1806+ const dbName = "mongoimport_roundtrip_fieldfile_test"
1807+
1808+ sessionProvider , _ , err := testutil .GetBareSessionProvider ()
1809+ require .NoError (t , err )
1810+ client , err := sessionProvider .GetSession ()
1811+ require .NoError (t , err )
1812+ t .Cleanup (func () {
1813+ if err := client .Database (dbName ).Drop (context .Background ()); err != nil {
1814+ t .Errorf ("dropping test database: %v" , err )
1815+ }
1816+ })
1817+
1818+ db := client .Database (dbName )
1819+ _ , err = db .Collection ("source" ).InsertMany (t .Context (), []any {
1820+ bson.D {{"a" , int32 (1 )}},
1821+ bson.D {{"a" , int32 (1 )}, {"b" , int32 (1 )}},
1822+ bson.D {{"a" , int32 (1 )}, {"b" , int32 (2 )}, {"c" , int32 (3 )}},
1823+ })
1824+ require .NoError (t , err )
1825+
1826+ fieldFile , err := os .CreateTemp (t .TempDir (), "fields-*.txt" )
1827+ require .NoError (t , err )
1828+ _ , err = fieldFile .WriteString ("a\n b\n " )
1829+ require .NoError (t , err )
1830+ require .NoError (t , fieldFile .Close ())
1831+
1832+ exportTarget , err := os .CreateTemp (t .TempDir (), "export-*.csv" )
1833+ require .NoError (t , err )
1834+ require .NoError (t , exportTarget .Close ())
1835+
1836+ exportToolOptions , err := testutil .GetToolOptions ()
1837+ require .NoError (t , err )
1838+ exportToolOptions .Namespace = & options.Namespace {DB : dbName , Collection : "source" }
1839+ me , err := mongoexport .New (mongoexport.Options {
1840+ ToolOptions : exportToolOptions ,
1841+ OutputFormatOptions : & mongoexport.OutputFormatOptions {
1842+ Type : "csv" ,
1843+ JSONFormat : "canonical" ,
1844+ FieldFile : fieldFile .Name (),
1845+ },
1846+ InputOptions : & mongoexport.InputOptions {},
1847+ })
1848+ require .NoError (t , err )
1849+ defer me .Close ()
1850+
1851+ f , err := os .OpenFile (exportTarget .Name (), os .O_WRONLY , 0o644 )
1852+ require .NoError (t , err )
1853+ _ , err = me .Export (f )
1854+ require .NoError (t , err )
1855+ require .NoError (t , f .Close ())
1856+
1857+ fields := "a,b,c"
1858+ importToolOptions , err := testutil .GetToolOptions ()
1859+ require .NoError (t , err )
1860+ importToolOptions .Namespace = & options.Namespace {DB : dbName , Collection : "dest" }
1861+ mi , err := New (Options {
1862+ ToolOptions : importToolOptions ,
1863+ InputOptions : & InputOptions {
1864+ File : exportTarget .Name (),
1865+ Type : "csv" ,
1866+ Fields : & fields ,
1867+ ParseGrace : "stop" ,
1868+ },
1869+ IngestOptions : & IngestOptions {},
1870+ })
1871+ require .NoError (t , err )
1872+ _ , _ , err = mi .ImportDocuments ()
1873+ require .NoError (t , err )
1874+
1875+ dest := db .Collection ("dest" )
1876+ n , err := dest .CountDocuments (t .Context (), bson.D {{"a" , int32 (1 )}})
1877+ require .NoError (t , err )
1878+ assert .EqualValues (t , 3 , n , "3 documents should have a=1" )
1879+ n , err = dest .CountDocuments (t .Context (), bson.D {{"b" , int32 (1 )}})
1880+ require .NoError (t , err )
1881+ assert .EqualValues (t , 1 , n , "1 document should have b=1" )
1882+ n , err = dest .CountDocuments (t .Context (), bson.D {{"b" , int32 (2 )}})
1883+ require .NoError (t , err )
1884+ assert .EqualValues (t , 1 , n , "1 document should have b=2" )
1885+ n , err = dest .CountDocuments (t .Context (), bson.D {{"c" , int32 (3 )}})
1886+ require .NoError (t , err )
1887+ assert .EqualValues (t , 0 , n , "c=3 should not have been exported (not in fieldFile)" )
1888+ }
0 commit comments