繁体   English   中英

MongoDB Java 驱动程序 3.4+ 光标到数组

[英]MongoDB Java Driver 3.4+ Cursor to Array

这个问题非常简单明了。 我不想使用游标,因为它会显着增加我的操作时间,我想一次获取所有文档并通过方法执行缓存它们。

        MongoClient mongoClient = new MongoClient( "HOST" );
        MongoDatabase db = mongoClient.getDatabase( "DB" );
        MongoCollection<Document> collection = db.getCollection( "COLLECTION" );
        FindIterable<Document> iterable = externalobjects.find( new Document( "test", "123" ) );

所以,我想将上面的iterable转换为一个列表,如何使用 find 并将 cursor 转换为数组?

FindIterable不包含您“找到”的文档,而是充当服务器端游标的句柄,为了从该服务器端游标中提取数据并将它们存储在您的应用程序中的列表中,您必须从游标读取文档并将它们添加到您的列表中。 例如:

// Java 8
List<Document> asList = new ArrayList<>();
documents.forEach((Consumer<Document>) d -> asList.add(d));

// Guava
List<Document> asList = Lists.newArrayList(documents);

// old skool
List<Document> asList = new ArrayList<>();
for (Document d : documents) {
    asList.add(d);
}

它没有魔法,也没有捷径。

FWIW,这听起来有点不寻常:

我不想使用游标,因为它大大减少了我的操作时间

通常减少操作时间是一件好事;) 我猜你可能是说它以某种方式降低了性能? 如果是这样, FindIterable包装一个FindOperationIterable ,它使用MongoBatchCursorAdapter作为其迭代器。 根据Java API docs t批处理游标的行为是:

MongoDB 以批处理的形式返回查询结果,该接口提供了对这些批处理的迭代器。 第一次调用 next 方法将返回第一批,后续调用将触发获取下一批结果的请求。 客户端可以通过设置调用 next 之间的 batchSize 属性来控制批处理大小。

因此, FindIterable用于减少find()调用结果的堆上占用空间(在您的应用程序内),并允许您的应用程序根据需要获取结果。 这里有一个很大的警告:默认的批处理大小是 (IIRC) 100 所以如果你正在阅读大量的 100 个文档,那么迭代FindIterable将导致多次调用回 MongoDB 服务器(每批 100 个文档一个结果集中)。 也许这就是您遇到的问题? 如果是这样,那么您可以将批处理大小设置为一个数字,以在 MongoDB 服务器端调用的数量和应用程序中可用的堆之间进行折衷。 您可以像这样设置批量大小:

int batchSize = ...;
FindIterable<Document> iterable = externalobjects
    .find(new Document("test", "123"))
    .batchSize(batchSize);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM