繁体   English   中英

mongodb批量更新/插入

[英]mongodb bulk updates/inserts

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

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

我的用途之一是,我想使用java驱动程序进行批量插入:

// 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不支持批量插入。

at any given time我最多可以有upto many thousands inserts mongo。

如果我一次插入1个文档,则可能存在性能/缩放问题。

是否有alternate way可以在2.4版的MONGODB中进行批量插入/ 向上插入/ 更新

简短的答案:

  • 否,用于更新/更新。
  • 是的,对于插入内容,如果您使用BulkWrite API,它将自动发生。

一些细节:

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

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

这意味着您可以编写代码以使用批处理,目前它的性能接近最佳状态(但仍会导致每个请求的往返延迟)。 当MongoLab支持2.6时,您将不必更改代码,并且更新批处理将开始。

您提到批量处理“数千个”操作。 意识到批次的大小是有限的。 目前,它们有1000项操作,超过16MB。 我建议人们将批次限制为数千个,因为任何较大的批次都不会影响性能,甚至在2000年之前,驱动程序必须将其分解,然后再提交给服务器。

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

一个相当简单的策略是使用待处理的结果队列来保存正在进行中的请求的期货。 您首先要尽快发送请求,然后将每个请求的Future存储在阻塞队列中。 当队列已满时,您将在发送请求和处理结果之间交替。 发送所有请求后,您只需耗尽结果队列即可。

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

HTH,Rob。

PS完全公开了我在使用异步Java驱动程序

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

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

暂无
暂无

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

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