1

我不知道该怎么说。好吧,最近我用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

上述错误似乎不再出现。

谁能深入解释一下两者之间的区别到底是什么?

谢谢

4

2 回答 2

4

单个大容量插入的最大大小为 16M 字节。这就是您在第一个示例中尝试做的事情。

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

于 2012-05-02T14:58:03.577 回答
3

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

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

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

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

  • 它不会插入之前对您的模型进行验证,您可能需要在插入之前检查这一点
  • 它需要是文档格式,不像 save 需要它是一个模型。as_document您可以通过调用模型轻松转换为文档。
于 2013-05-19T22:43:26.673 回答