我们通过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 / 更新
答案 0 :(得分:3)
简答:
一些细节:
对于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”});