Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java程序中使用MongoExport命令?_Java_Mongodb - Fatal编程技术网

如何在java程序中使用MongoExport命令?

如何在java程序中使用MongoExport命令?,java,mongodb,Java,Mongodb,我可以使用mongoshell中的Mongoexport命令导出整个集合 但是,我正在尝试编写一个java程序,它使用Mongoexport命令将整个MongoDB集合导出到CSV文件中 我的代码: 我面临java.io.IOException:无法运行程序“mongoexport”:CreateProcess error=2,系统找不到指定的文件。 有谁能帮我解决这个问题吗 以下是用于抑制警告的更新代码,包括需要导出的字段(这对于CSV模式是必需的),并将绝对路径添加到mongoexport.

我可以使用mongoshell中的Mongoexport命令导出整个集合

但是,我正在尝试编写一个java程序,它使用Mongoexport命令将整个MongoDB集合导出到CSV文件中

我的代码: 我面临java.io.IOException:无法运行程序“mongoexport”:CreateProcess error=2,系统找不到指定的文件。

有谁能帮我解决这个问题吗


以下是用于抑制警告的更新代码,包括需要导出的字段(这对于CSV模式是必需的),并将绝对路径添加到
mongoexport.exe

public static void main(String[] args) {

        String db = "pack";
        String col = "col";
        String Host = "localhost";
        String Port = "27017";
        String fileName = "D:/files/sample.csv";

        String command = "C:\\Program Files\\MongoDB\\Server\\3.4\\bin\\mongoexport.exe --host " + Host + " --port " + Port + " --db " + db + " --collection " + col + " --type=csv --fields _id,email,createdAt, --out " + fileName + "";

        try {
            System.out.println(command);
            Process process = Runtime.getRuntime().exec(command);
            int waitFor = process.waitFor();
            System.out.println("waitFor:: " + waitFor);
            BufferedReader success = new BufferedReader(new InputStreamReader(process.getInputStream()));
            BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));

            String s = "";
            while ((s = success.readLine()) != null) {
                System.out.println(s);
            }

            while ((s = error.readLine()) != null) {
                System.out.println("Std ERROR : " + s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
调试说明:-

mongoexport.exe --host localhost --port 27017 --db test --collection Account --csv --out D:/files/sample.csv    
如果您遇到任何问题,请首先检查该命令是否有效,然后在Java程序中尝试

示例:-

mongoexport.exe --host localhost --port 27017 --db test --collection Account --csv --out D:/files/sample.csv    
使用ProcessBuilder的替代解决方案:-

mongoexport.exe --host localhost --port 27017 --db test --collection Account --csv --out D:/files/sample.csv    
我已将processBuilder.redirectErrorStream(true)设置为true。因此,您将在一个流中获得所有流程消息

public static void main(String[] args) {

        String db = "pack";
        String col = "col";
        String Host = "localhost";
        String Port = "27017";
        String fileName = "D:/files/sample.csv";

    String command = "C:\\Program Files\\MongoDB\\Server\\3.4\\bin\\mongoexport.exe --host " + Host + " --port " + Port + " --db " + db + " --collection " + col + " --type=csv --fields _id,email,createdAt, --out " + fileName + "";

    try {
        System.out.println(command);

        StringTokenizer st = new StringTokenizer(command);
        String[] cmdarray = new String[st.countTokens()];
        for (int i = 0; st.hasMoreTokens(); i++)
            cmdarray[i] = st.nextToken();

        ProcessBuilder processBuilder = new ProcessBuilder(cmdarray);
        processBuilder.redirectErrorStream(true);

        Process process = processBuilder.start();
        BufferedReader processOutput = new BufferedReader(new InputStreamReader(process.getInputStream()));

        String s = "";
        while ((s = processOutput.readLine()) != null) {
            System.out.println(s);
        }


    } catch (Exception e) {
        e.printStackTrace();
    }

您正在使用Mongo3.4吗?只是为了改进export命令的语法。我在上面的程序中使用Mongo 3.2,success.readLine()将变为null,因此它将进入error.readLine()块,然后它将从while循环的error块导出csv文件。我不知道为什么它是从错误块导出csv文件,而不是从成功块导出。有人能帮我吗?事实上,Java代码并没有在文件上写任何东西,不管成功与否。我们正在执行的命令将数据写入csv文件。while循环(成功或错误)只是在控制台上显示消息。如果有任何错误,csv应该只有标题记录。是的,实际上整个数据都写入了csv文件。成功导出了所有记录。一切正常,但它正在从错误块导出csv文件,而不是从成功块导出csv文件。这就是我现在面临的问题。你能展示一下你在控制台中看到的东西吗?例如,Std ERROR:后跟一些字符串?在stdError上面添加了一个scrrenshot。