MongoDB批量插入
MongoDB批量插入,在某些情况下,您可能需要插入或摄取大量的数据到MongoDB数据库。这些批量插入有一些特殊的考虑,与其他写操作不同。
一、用insert()方法
insert()方法,当传递文档数组,执行批量插入,和原子插入每个文档。批量插入能用摊销写关注的成本显著的增加性能。
版本2.2更新,在2.2版本,insert()在mongo命令行获得了批量插入的支持。
在驱动程序中,你能为批量配置写关注而不是在单文档级别上。
在他们的插入操作中,驱动程序有一个ContinueOnError选项,所以一个插入失败,批量插入操
续插入剩下的文档。
注意:
如果在批量插入期间发生多个错误,客户端只收到最后一次发生的错误。
也可以查看:
在你的应用程序中执行批量插入的驱动文件的细节,也可以查看导入和导出MongoDB数据。
二、对分片集群批量插入
虽然在非分片集群上ContinueOnError是可选的,所有的批量插入用ContinueOnError到一个分片集合运行,他是不能被禁止的。
大批量插入操作,包括初始数据插入或常规数据导入,对于批量插入,可考虑以下策略:
预分割集合
如果分片集合为空,那么集合只有一个初始块,他驻留在一个单一的分片。然后MongoDB中必须花时间来接收数据,创建拆分,并分发拆分块到可用的分片。为了避免这种性能损失,作为一个分片集群分割大块的驻留你可以预先分割的集合。
插入到多个mon......
存储
一、数据模型
MongoDB以BSON文档的形式存储数据,它是Key的富映射,或字段名,值。BSON支持丰富的类型集
合,在BSON文档中的字段能包含数据值或内嵌的文档。在MongoDB中所有文档必须小于16MB,这
是BSON文档的大小。
在MongoDB中的每个文件存储在一个记录中它包括文档自身和额外的空间,或者说是填充,填充
因为结果更新文件增长。所有的记录位于连接的磁盘上,当一个文档变得比分配的记录大时,
MongoDB必须分配一个新的记录。新的分配要求MongoDB移动一个文件,并更新引用文档的所有索
引,这比就地更新需要更多的时间,并导致存储碎片。
所有的记录都是一个集合的一部分,这是文献中MongoDB数据库的逻辑分组。在一个集合中的文
档共享一组索引,而且通常这些文档共享公共字段和结构。
在MongoDB中的数据库结构是一组相关的集合。每个数据库都有一个唯一的数据文件集,并且可
能包含大量的集合。此外,每个数据库都有一个唯一的写入锁,在写操作期间锁定写操作到数据
库,一个单独的MongoDB部署可能有很多的数据库。
二、日志
为了确保所有MongoDB修改的数据集被永久地写入到磁盘,MongoDB中记录所有修改到日志,写入磁盘比写入数据更频繁。该日志让MongoDB在mongod实例退出后成功恢复的数据文件中的数据,而不清除所有更改。
请参阅日记记录机制的有关MongoDB日志的详细信息。
......
插入文档
在MongoDB中,b.collection.insert()方法添加新文档到一个集合。此外,无论是db.collection.update()方法和db.collection.save()方法也可以通过称为更新插入的操作添加新文档。更新插入既是执行一个已存在的文档更新,也是在修改文档不存在是插入一个新文档的操作。
本教程提供了使用中mongo命令行的三种方法插入操作的例子。
一、用insert()方法插入一个文档
下面的语句插入带有三个字段的文档到集合inventory:
db.inventory.insert( { _id: 10, type: "misc", item: "card", qty: 15 } )
在该示例中,文档有一个用户指定的值为10的_id字段。该值必须在集合inventory中是唯一的。
更多示例,请参阅insert()。
二、用update()方法插入一个文档
调用update()方法的更新插入标志,如果没有文件匹配更新的查询条件则创建一个新的文档。 [1]
下面的示例创建一个新的文档,如果在inventory集合中没有包含{ type: "books", item : "journal" }的文档:
db.inventory.update(
{ type: "book", item : "journal" },
{ $set : { qty: 10 } },
&nb......
查询文档
在MongoDB中,db.collection.find()方法从集合中检索文档。[1] db.collection.find()方法返回一个游标来检索文档。
本教程提供了使用db.collection.find()方法在mongo shell读操作的例子。在这些例子中,检索文档包含它们的所有字段。限制从检索的文档返回的字段,查看限制字段从查询返回。
[1] db.collection.findOne()方法也执行读取返回一个单一的文档的操作。在内部,db.collection.findOne()方法是用db.collection.find()方法返回一个。
一、选择在一个集合中的所有文档
一个空的文档查询({}) 选择集合中的所有文档:
db.inventory.find( {} )
不指定查询文档的find()方法等同于指定一个空的查询文档。因此,下面的操作等效于前面的操作:
db.inventory.find()
二、指定匹配条件
指定匹配条件,用查询文档 { <field>: <value> }选择包含具有指定值<field>: <value>的所有文档。
下面的示例检索inventory集合类型字段的值为小吃的所有文档:
db.inventory.find( { type: "snacks" } )
三、指定条件下使用查询运算符
在一个MongoDB查询中查询文档可以使用查询运算符来指定条件,下面的示例选择inventory集中类型字段的值是'食品'或'小吃'的所有文档:
db.inventory.find( { type: { $in: [ 'food', 'snacks' ] } } )
虽......
限制从一个查询返回的字段
映射指定规则限制从所有匹配文档返回的字段。映射接受从一个文档用纳入或排除的方式从结果集返回字段的列表。您也能指定字段包括(例如 { field: 1 })或者指定字段排除(例如 { field: 0 })。
重要提示
_id字段默信包括在结果集里。要从结果集里排除_id字段,你需要在文档映射里指定_id字段的排除(例如{ _id: 0 })。
除了_id字段,你不可能对包括和排除语义进行组合。
本教程提供各种查询限制匹配文档返回字段的例子。
在mongo命令行下教程的例子用的集合是inventory,方法是 db.collection.find()。 db.collection.find() 方法返回一个游标检索文档。实例的选择查询条件,查看查询文档。
一、在匹配的文档里返回所有的字段
如果你没有指定映射, find()方法返回所有查询到的匹配文档的所有字段。
db.inventory.find( { type: 'food' } )
这个操作返回inventory集合中type字段的值为"food"的所有文档。返回文档包括所有的字段。
二、只返回指定的字段和_id字段
映射可以明确地包含几个字段。在下面的操作中,find()方法返回查询匹配的所有文档。在结果集里,查询匹配的文档只有item和qty字段以及默认的_id字段返回。
db.inventory.find( { type: 'food' }, { item: 1, qty: 1 } )
三、只返回指定字段
可以从结果中,通过指定排除在映射里移除_id字段,就像下面的例子:
db.inventory.fi......