MongoDB批量插入
MongoDB批量插入,在某些情况下,您可能需要插入或摄取大量的数据到MongoDB数据库。这些批量插入有一些特殊的考虑,与其他写操作不同。
一、用insert()方法
insert()方法,当传递文档数组,执行批量插入,和原子插入每个文档。批量插入能用摊销写关注的成本显著的增加性能。
版本2.2更新,在2.2版本,insert()在mongo命令行获得了批量插入的支持。
在驱动程序中,你能为批量配置写关注而不是在单文档级别上。
在他们的插入操作中,驱动程序有一个ContinueOnError选项,所以一个插入失败,批量插入操
续插入剩下的文档。
注意:
如果在批量插入期间发生多个错误,客户端只收到最后一次发生的错误。
也可以查看:
在你的应用程序中执行批量插入的驱动文件的细节,也可以查看导入和导出MongoDB数据。
二、对分片集群批量插入
虽然在非分片集群上ContinueOnError是可选的,所有的批量插入用ContinueOnError到一个分片集合运行,他是不能被禁止的。
大批量插入操作,包括初始数据插入或常规数据导入,对于批量插入,可考虑以下策略:
预分割集合
如果分片集合为空,那么集合只有一个初始块,他驻留在一个单一的分片。然后MongoDB中必须花时间来接收数据,创建拆分,并分发拆分块到可用的分片。为了避免这种性能损失,作为一个分片集群分割大块的驻留你可以预先分割的集合。
插入到多个mongos
并行导入进程,发送插入操作到一个以上的mongos实例。预分裂空集合首次作为在大块分割的分片集群描述。
避免单调节流
如果你的分片键在插入过程中单调递增,那么所有插入的数据去到集合中的最后一个块,这将最终总是在一个单一的分片。因此,集群的插入容量不会超过该单分片的插入能力。
如果你插入值比单一分片可以处理的更大,并且如果你不能避免单调递增分片键,然后再考虑以下修改您的应用程序:
翻转碎片键的二进制位。这将保留该信息,并避免关联插入顺序与数值递增序列。
交换的第一个和最后一个16位字到随机的插入。
示例:
下面的例子中,在C + +,交换BSON ObjectID的产生,使得它们不再单调增加前缘和后16位的字。
using namespace mongo;
OID make_an_id() {
OID x = OID::gen();
const unsigned char *p = x.getData();
swap( (unsigned short&) p[0], (unsigned short&) p[10] );
return x;
}
void foo() {
// create an object
BSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" );
// now we may insert o into a sharded collection
}