Mongoid创建vs collection.insert

时间:2012-05-02 12:15:09

标签: mongodb mongoid

我不知道怎么说这个。好吧,最近我在mongoid的rails项目上工作,我的任务是在Mongodb中插入多个记录。

假设在数据库中插入PartPriceRecord的多个记录。谷歌搜索后,我遇到了 collection.insert 命令:

  

PartPriceRecord.collection.insert(multiple_part_price_records)

但是在插入大量记录时,MongoDb似乎总是提示我错误信息:

超过最大插入大小16,000,000字节

谷歌搜索我发现单个文档的MongoDb的上限,但令人惊讶的是当我将上述查询更改为:

multiple_part_price_records.each do|mppr|
  PartPriceRecord.create(mppr)
end

上述错误似乎不再出现。

任何人都可以深入解释这两者之间的区别究竟是什么?

谢谢

2 个答案:

答案 0 :(得分:4)

单个批量插入的最大大小为16M字节。这就是你在第一个例子中想要做的事情。

在第二个示例中,您将单独插入每个文档。因此,每个插入都在插入的最大限制之下。

答案 1 :(得分:3)

@Kyle非常简洁地解释了他的答案的差异(+ 1),但至于你的问题的解决方案,你可能想看看批量插入:

BATCH_SIZE = 200
multiple_part_price_records.each_slice(BATCH_SIZE) do |batch|
    PartPriceRecord.collection.insert(batch)
end

这会将记录分成200个批次(或任何最适合您情况的大小)并将其插入该限制内。这将比单独运行保存更快批次,这将向数据库发送更多请求。

关于collection.insert的一些快速注意事项:

  • 在插入之前,在您的模型上运行验证,您可能需要在插入之前检查此内容
  • 需要采用与保存不同的文档格式,这需要它是模型。您可以通过调用模型上的as_document轻松转换为文档。