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

标签 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.");
        }

}

我知道我可以创建一个缓冲区来存储数据并在之后写入,但是大问题仍然没有解决:文档是一个一个访问的。因此,我的问题是:如何一次访问多个文档以便将它们写入 ./outputData.txt

最佳答案

简单来说,只需“一次”调用 iterator() 返回 MongoCursor,因为这就是你需要做的所有事情。

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

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.");
}

用完光标后,只需关闭返回的文件描述符。

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


作为一个完整的列表,您可以在默认端口上针对本地 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();
            }
        }
    }
}

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

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

{ "_id" : { "$oid" : "5b0bd9576a6bfa1f30e6c320" }, "a" : 1 }
{ "_id" : { "$oid" : "5b0bd9576a6bfa1f30e6c321" }, "a" : 2 }
{ "_id" : { "$oid" : "5b0bd9576a6bfa1f30e6c322" }, "a" : 3 }

关于java - 将流式集合写入文件 Java-Mongo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50525309/

相关文章:

java - 在运行时更改 Web 应用程序的状态

java - 我的 "contains"算法有什么问题?

java - 伪代码转Java

java - 如何在使用带有 selenium 的 java 的网页中出现警报时得到通知 >

java - 您可以在 JAX-RS 中全局设置 Jackon 的 Include.NON_NULL 吗?

iphone - 如何在 iPad 上运行/移植 MongoDB?

node.js - 如何通过driver获取Mongodb中的连接

java - "or"嵌入文档java中的条件

mongodb - geoNear 异常 : 'near' field must be point

javascript - db.runCommand 意外标记非法