将流式集合写入文件Java-Mongo

qwe*_*rty 5 java mongodb

我有一台运行Monogdb的服务器,它也有一个名为的集合mycoll.新文档将不断插入到集合中.我的目的是拥有一个本地文件,其中包含该集合的所有文档的副本.我目前的做法如下:

String host = "myHost";
int port = 3717;
String user = "user";
String password = "pass";
String databaseName = "dbName";
String collectionName = "mycoll";

MongoCredential credential = MongoCredential.createCredential(user, databaseName, password.toCharArray());
MongoClient mongoClient = new MongoClient(new ServerAddress(host, port), Arrays.asList(credential));
MongoDatabase database = mongoClient.getDatabase(databaseName);
MongoCollection<Document> collection = database.getCollection(collectionName);
FindIterable<Document> cursor = collection.find();

String path = "./outputData.txt";


while(cursor.iterator().hasNext()){

        try(FileWriter fw = new FileWriter(path, true);
                BufferedWriter bw = new BufferedWriter(fw);
                PrintWriter out = new PrintWriter(bw))
        {
                out.println(cursor.iterator().next());
        } catch (IOException e) {
                System.out.println("Error writing to file.");
        }

}
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建一个缓冲区来存储数据并在之后编写它,但是最大的问题仍然没有解决:文档是逐个访问的.因此,我的问题是:我怎么能一次访问几个文件才能写入./outputData.txt

Nei*_*unn 2

简单来说,只需MongoCursor调用iterator()“once”即可返回,因为这就是您需要做的全部。

然后非常简单地在循环“外部”创建文件句柄。唯一真正属于循环“内部”的事情是实际的光标迭代和写入。

try {    

  MongoCursor<Document> cursor = collection.find().iterator();
  String path = "./outputData.txt";

  PrintWriter out = new PrintWriter(
    new BufferedWriter(new FileWriter(path, true))
  );

  while(cursor.hasNext()){
    out.println(cursor.next().toJson());
  }

  out.flush();            // flush to ensure writes
  out.close();            // close the handle when done

} catch (IOException e) {
  System.out.println("Error writing to file.");
}
Run Code Online (Sandbox Code Playgroud)

使用完游标后,只需关闭返回的文件描述符即可。

您真正需要注意的是,您不会“创建”文件描述符或继续在循环“内”重新打开。这是您执行一次的事情,然后在每次迭代中通过任何方式简单地“写出”。


作为完整的列表,您可以在默认端口上针对本地 MongoDB 运行代码,无需进行身份验证。添加选项以根据需要更改它,但这是所需的“基本”代码

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

public class Application {

    public static void main(String[] args) {

        PrintWriter out  = null;
        MongoClient mongoClient = null;

        try {

            mongoClient = new MongoClient();
            MongoDatabase db = mongoClient.getDatabase("test");
            MongoCollection<Document> collection = db.getCollection("sample");

            out = new PrintWriter(
                    new BufferedWriter(new FileWriter("output.txt"))
            );

            // Clear collection and insert data
            collection.deleteMany(new Document());
            collection.insertMany(Arrays.asList(
                    new Document("a", 1),
                    new Document("a", 2),
                    new Document("a", 3)
            ));

            MongoCursor<Document> cursor = collection.find().iterator();

            while ( cursor.hasNext() ) {
                out.println(cursor.next().toJson());
                //System.out.println(cursor.next().toJson());
            }

            out.flush();

        } catch(Exception e) {
            System.out.println(e.getMessage());
        } finally {
            if (out != null) {
                out.close();
            }
            if (mongoClient != null) {
                mongoClient.close();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次运行时创建一个新文件并输出插入到集合中的文档。

给你一个类似这样的文件:

{ "_id" : { "$oid" : "5b0bd9576a6bfa1f30e6c320" }, "a" : 1 }
{ "_id" : { "$oid" : "5b0bd9576a6bfa1f30e6c321" }, "a" : 2 }
{ "_id" : { "$oid" : "5b0bd9576a6bfa1f30e6c322" }, "a" : 3 }
Run Code Online (Sandbox Code Playgroud)