mongodb批量更新/插入

时间:2014-08-04 02:30:26

标签: mongodb mongodb-java

我们通过heroku / mongolab运行mongo-2.4,它不支持2.6生产

http://docs.mongolab.com/ops/#version-mgmt

我的一个用途,我想使用java-driver进行批量插入:

// 1. Ordered bulk operation
BulkWriteOperation builder = coll.initializeOrderedBulkOperation();
builder.insert(new BasicDBObject("_id", 1));
builder.insert(new BasicDBObject("_id", 2));
builder.insert(new BasicDBObject("_id", 3));

BulkWriteResult result = builder.execute();

但是,我无法将prod升级到2.6,2.4不支持批量插入。

我可以upto many thousands inserts到mongo at any given time

如果我一次插入1个文档,可能会出现性能/缩放问题。

在2.4中的MONGODB中是否有alternate way批量插入/ upserts / 更新

2 个答案:

答案 0 :(得分:3)

简答:

  • 不支持upserts / updates。
  • 是插入的,如果您使用BulkWrite API,它会自动发生。

一些细节:

对于2.6之前的MongoDB,无法向服务器发送一批更新。您必须使用OP_UPDATE消息,该消息一次只支持单个更新操作。

好消息是,Java驱动程序将根据连接的服务器版本自动降级为使用旧消息。对于插入,由于OP_INSERT支持2.6之前的批次,因此仍然会产生批量。

这意味着您可以编写代码以使用批处理,现在它将执行接近最优(但仍会产生每请求往返延迟)。当MongoLab支持2.6时,您不必更改代码,只会发生更新批处理。

你提到批量生产数以及数千个"的运作。意识到批次的大小有限制。目前它们是1000个操作,略高于16MB。我已经建议人们将批量限制为几千,因为任何更大的都不会对性能产生影响,甚至在提交到服务器之前必须由驱动程序分解2000。

最后,如果您真的需要摆脱往返延迟,可以使用Asynchronous Java Driver查看。如果您愿意做一些工作以允许更多请求立即在飞行中,您可以通过批处理获得大部分(如果不是全部)性能。

一个相当简单的策略是使用pending results queue来保存正在进行的请求的未来。您首先尽可能快地发送请求,并将每个请求的Future存储在阻塞队列中。当队列已满时,您可以在发送请求和处理结果之间切换。一旦发出所有请求,您只需排空结果队列。

这种简单的策略可以大大提高应用程序的吞吐量。

HTH, 罗布。

P.S。在完整披露中,我处理Asynchronous Java Driver

答案 1 :(得分:1)

你可以在mongo shell中批量插入,将所有插入文档保存到一个数组中,然后插入。

db.insert({“name”:“Admin”,“project”:“pro1”},{“name”:“Admin”,“project”:“pro2”});