gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:31:14 26 4
gpt4 key购买 nike

我有一个运行 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com