Mongoose insertMany 限制

29

Mongoose 4.4现在有一个insertMany函数,它使您能够验证文档数组并在所有文档有效时一次性插入它们,而不是对每个文档进行单独操作:

var arr = [{ name: '星球大战' }, { name: '帝国反击战' }]; Movies.insertMany(arr, function(error, docs) {});

如果我有一个非常大的数组,应该将它们分批处理吗?还是数组大小没有限制?

例如,我想为每个电影创建一个新文档,我有10,000部电影。

3个回答

23

基于个人经验,建议每批处理100-200条数据,既能提高性能,又不会给系统带来过大的负担。

insertMany操作组最多可以有1000个操作。如果一个组超过了这个限制,MongoDB将把该组分成1000个或更少的较小组。例如,如果队列包含2000个操作,则MongoDB将创建2个组,每个组有1000个操作。

这些大小和分组机制是内部性能细节,可能会在以后的版本中发生变化。

在分片集合上执行有序操作列表通常比执行无序操作列表要慢,因为在有序列表中,每个操作都必须等待前一个操作完成。


4
这不是最新版本 - 从v3.6开始,批处理大小为100,000。 - Elad Katz

18

Mongo 3.6更新:

insertMany()的限制在Mongo 3.6中增加,从1000增加到100,000。 这意味着现在,超过100,000操作的组将相应地分成更小的组。 例如:一个有200,000个操作的队列将被分成两个包含各100,000个操作的组。


我尝试一次性添加50000,但很遗憾速度很慢。我尝试使用1000,速度更快。 - Ashok Dey
1
@AshokDey,我从未说过它会更快 :) 然而,这可能取决于您的机器类型(RAM数量,磁盘写入等...)。您是否正在使用async/await将数据发送到另一台服务器?这也可能导致速度变慢。 - FireBrand
啊..看来我忘记粘贴Github仓库的URL了,这是它的链接:https://github.com/ashokdey/scale 您可以在Readme中了解用例,我很高兴能看到您成为合作者。对于我的用例,相比一次插入50k条记录,这更快捷。 - Ashok Dey
1
文档的总大小是否也有限制? - KaliCharan
根据MongoDB的官方文档,每个文档的大小限制为16MB,可以在此处查看:https://docs.mongodb.com/manual/reference/limits/。您可以增加大小限制(请参见相同链接),但是对于存储如此大的文档,MongoDB可能不是最佳选择,您最好使用某种云存储(例如S3、GCS等)。 - FireBrand

7

该方法将数组传入MongoDB的insertMany方法中进行插入,因此数组的大小实际上取决于您的计算机性能

但请注意,MongoDB处理多个操作的方式有另一个值得考虑的点,这不是限制,而是需要考虑的事情。默认情况下,它每次处理1000个操作批次,并分拆超过1000个操作的部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接