db.collection.insert()

在本页面

Definition

  • db.collection. insert ( )
    • 将一个或多个文档插入集合中。

insert()方法具有以下语法:

在 2.6 版中进行了更改。

db.collection.insert(
   <document or array of documents>,
   {
     writeConcern: <document>,
     ordered: <boolean>
   }
)
ParameterTypeDescription
document文件或阵列要插入集合的文档或文档数组。
writeConcerndocument可选的。表示write concern的文档。省略使用默认的写关注。参见Write Concern


2.6 版中的新功能。
| ordered |布尔值|可选。如果true,请按 Sequences 在数组中插入文档,并且如果其中一个文档发生错误,则 MongoDB 将返回而不处理数组中的其余文档。
如果false,则执行无序插入,并且如果其中一个文档发生错误,请 continue 处理数组中的其余文档。
默认为true
2.6 版中的新功能。

在 2.6 版中进行了更改:insert()返回一个包含操作状态的对象。

返回:一个WriteResult对象,用于单个插入。
用于批量插入的BulkWriteResult对象。

Behaviors

Write Concern

在 2.6 版中进行了更改。

insert()方法使用insert命令,该命令使用默认的write concern。要指定其他写关注点,请在 options 参数中包括写关注点。

Create Collection

如果该集合不存在,则insert()方法将创建该集合。

_id Field

如果文档未指定_id字段,则 MongoDB 将添加_id字段并为文档分配唯一的ObjectId,然后再插入。大多数驱动程序会创建一个 ObjectId 并插入_id字段,但如果驱动程序或应用程序未创建,则mongod将创建并填充_id

如果文档包含_id字段,则_id值在集合中必须唯一,以避免重复的键错误。

Examples

以下示例将文档插入products集合。如果该集合不存在,则insert()方法创建该集合。

插入文档而不指定_id 字段

在以下示例中,传递给insert()方法的文档不包含_id字段:

db.products.insert( { item: "card", qty: 15 } )

在插入过程中,mongod将创建_id字段,并为其指定一个唯一的ObjectId值,这由插入的文档验证:

{ "_id" : ObjectId("5063114bd386d8fadbd6b004"), "item" : "card", "qty" : 15 }

ObjectId值特定于机器和运行操作的时间。因此,您的值可能与示例中的值不同。

插入指定_id 字段的文档

在下面的示例中,传递给insert()方法的文档包括_id字段。 _id的值在集合中必须唯一,以避免重复的键错误。

db.products.insert( { _id: 10, item: "box", qty: 20 } )

该操作将以下文档插入products集合:

{ "_id" : 10, "item" : "box", "qty" : 20 }

插入多个文档

下面的示例通过将文档数组传递给insert()方法来执行三个文档的批量插入。默认情况下,MongoDB 执行“有序”插入。对于* ordered *插入,如果在插入其中一个文档期间发生错误,则 MongoDB 会返回错误,而不会处理数组中的其余文档。

数组中的文档不需要具有相同的字段。例如,数组中的第一个文档具有_id字段和type字段。由于第二和第三文档不包含_id字段,因此mongod将在插入期间为第二和第三文档创建_id字段:

db.products.insert(
   [
     { _id: 11, item: "pencil", qty: 50, type: "no.2" },
     { item: "pen", qty: 20 },
     { item: "eraser", qty: 25 }
   ]
)

该操作插入了以下三个文档:

{ "_id" : 11, "item" : "pencil", "qty" : 50, "type" : "no.2" }
{ "_id" : ObjectId("51e0373c6f35bd826f47e9a0"), "item" : "pen", "qty" : 20 }
{ "_id" : ObjectId("51e0373c6f35bd826f47e9a1"), "item" : "eraser", "qty" : 25 }

执行无序插入

以下示例对三个文档执行“无序”插入。对于* unordered *插入,如果在插入一个文档中发生错误,MongoDB 会 continue 将其余文档插入数组中。

db.products.insert(
   [
     { _id: 20, item: "lamp", qty: 50, type: "desk" },
     { _id: 21, item: "lamp", qty: 20, type: "floor" },
     { _id: 22, item: "bulk", qty: 100 }
   ],
   { ordered: false }
)

覆盖默认写问题

对副本集的以下操作指定"w: majority"write concernwtimeout的 5000 毫秒,以使该方法在写入传播到大多数有表决权的副本集成员之后返回,或者该方法在 5 秒钟后超时。

在版本 3.0 中进行了更改:在以前的版本中,majority引用了副本集的所有成员的大多数,而不是多数投票成员。

db.products.insert(
    { item: "envelopes", qty : 100, type: "Clasp" },
    { writeConcern: { w: "majority", wtimeout: 5000 } }
)

WriteResult

在 2.6 版中进行了更改。

当传递单个文档时,insert()返回一个WriteResult对象。

Successful Results

insert()返回包含操作状态的WriteResult对象。成功后,WriteResult对象包含有关插入的文档数的信息:

WriteResult({ "nInserted" : 1 })

写关注错误

如果insert()方法遇到写关注错误,则结果包括WriteResult.writeConcernError字段:

WriteResult({
   "nInserted" : 1,
   "writeConcernError" : {
      "code" : 64,
      "errmsg" : "waiting for replication timed out at shard-a"
   }
})

与写入问题无关的错误

如果insert()方法遇到非写关注错误,则结果包括WriteResult.writeError字段:

WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 11000,
      "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.foo.$_id_  dup key: { : 1.0 }"
   }
})

BulkWriteResult

在 2.6 版中进行了更改。

传递文档数组时,insert()返回BulkWriteResult()对象。有关详细信息,请参见BulkWriteResult()