OPTIONS
翻译或纠错本页面

写操作概览

写操作指的是任何一个创建或修改MongoDB实例中数据的操作。在MongoDB中,写操作针对一个单一的 集合 。MongoDB中所有写操作在一个单一的 文档 层面都具有原子性。

MongoDB中有三种不同类型的写操作:插入更新 以及 删除 。插入操作向一个集合中添加新的数据,更新操作修改现有数据,而删除操作则将数据从集合中删除。所有的插入、更新及删除操作都只能原子性地影响一个文档。

对于更新以及删除操作, 您可以指定一些可以识别出需要更新或删除文档的条件或准则。 这些操作使用 read operations 中相同的查询语法来指定条件。

MongoDB允许应用决定写操作所需确认的可接受程度。请查阅 写关注 以了解更多信息。

插入

在MongoDB中, db.collection.insert() 方法向某集合中插入新的 文档

下面的图表展示了一个MongoDB插入操作的组件:

The components of a MongoDB insert operations.

The components of a MongoDB insert operations.

下面的图表展示了和SQL中相同的查询:

The components of a SQL INSERT statement.

The components of a SQL INSERT statement.

示例

下面的操作向 users 集合插入一个新的文档。新的文档有四个字段: nameagestatus , 以及一个 _id 字段。如果新的文档不存在 _id 字段,MongoDB经常会自动增加 _id 字段。

db.users.insert(
   {
      name: "sue",
      age: 26,
      status: "A"
   }
)

请查阅 db.collection.insert() 以了解更多信息及示例。

插入操作

您插入一个 不包含 _id 字段的新文档时,客户端库或者 mongod 实例将会自动增加一个 _id 字段,并且将该字段填充为一个唯一的 ObjectId

您指定 _id 字段时,集合中该字段的值必须唯一。对于 写关注 中的操作, 如果您试图使用一个重复的 _id 值创建文档, mongod 将会返回一个重复键值的异常。

其它插入文档的方法

您也可以使用带有 upsert 选项的方法向一个集合中插入新文档。如果这个选项被设置为 true ,这些方法要么就会修改现有文档或者在没有可以匹配该查询的现有文档的情况下插入一个新的文档。请查阅 使用 upsert 选项进行更新操作 以了解更多信息。

更新

在MongoDB中, db.collection.update() 方法修改 集合 中现有的 文档db.collection.update() 方法既可以接收查询条件来决定更新哪些文档,也可以接收一个影响其行为的选项文档,例如使用 multi 选项来更新多个文档。

下面的图表展示了一个MongoDB更新操作的组件:

The components of a MongoDB update operation.

The components of a MongoDB update operation.

下面的图表展示了和SQL中相同的查询:

The components of a SQL UPDATE statement.

The components of a SQL UPDATE statement.

示例

db.users.update(
   { age: { $gt: 18 } },
   { $set: { status: "A" } },
   { multi: true }
)

这个在 users 集合上的更新操作将会把满足: age 大于 18 条件文档的 status 字段 全部设为 A

请查阅 db.collection.update()update() Examples 以了解更多信息。

默认的更新操作

默认地, db.collection.update() 方法只更新一个 单一的 文档。然而,通过使用 multi 选项, update() 可以更新一个集合中满足条件的所有文档。

The db.collection.update() method either updates specific fields in the existing document or replaces the document. See db.collection.update() for details as well as examples.

在执行更新操作的过程中,增加文档的大小超过为该文档分配的空间时,更新操作就会在磁盘上重定位文档。

MongoDB preserves the order of the document fields following write operations except for the following cases:

  • The _id field is always the first field in the document.
  • 包括 renaming 字段名称的更新操作可能会造成 文档中字段的重新排序。

在 2.6 版更改: 从2.6版本开始,MongoDB 主动尝试保持一个文档中的字段顺序。而在版本2.6之前,MongoDB 不会主动保持一个文档中的字段顺序。

使用 upsert 选项进行更新操作

如果 update() 方法包括 upsert: true * 并且 * 没有文档匹配该更新操作的查询模块,该更新操作就会创建一个新的文档。 如果存在匹配的文档,使用 upsert: true 的更新操作就会对匹配的文档或者文档集进行修改。

通过指定 upsert: true ,结果表明:在一个 * 单一的 * 操作中,如果不存在与该更新匹配的文档, 将会执行一个插入操作。 请查阅 update() 以了解更多关于 upsert 操作的细节。

在 2.6 版更改: 在2.6版本中,新的 Bulk() 方法以及基础的 update 命令将会允许您在一个单一的调用中使用 upsert: true 操作执行多次更新。

删除

在MongoDB中, db.collection.remove() 方法从一个集合中删除文档。 db.collection.remove() 方法接收一个查询条件来决定删除哪个文档。

下面的图表展示了一个MongoDB删除操作的组件:

The components of a MongoDB remove operation.

The components of a MongoDB remove operation.

下面的图表展示了和SQL中相同的查询:

The components of a SQL DELETE statement.

The components of a SQL DELETE statement.

示例

db.users.remove(
   { status: "D" }
)

这个在 users 集合上的删除操作将删除满足 status 等于 D 条件的所有文档。

For more information, see db.collection.remove() method and 删除文档.

删除操作

默认地, db.collection.remove() 方法删除满足其条件的所有文档。然而,该方法可以接收一个标记来将这个删除操作限制在一个单一的文档中。

写操作的隔离性

虽然写操作会修改 位于 该文档的多个子文档,但是一个单一文档的修改通常具有原子性。 对于那些修改多个文档的写操作而言,从整体上看,该操作并不具备原子性,因为它或许会与其它操作交叉进行。

其它所有操作都不具备原子性。但是,您可以尝试使用 隔离算子 来分隔那些影响多个文档的写操作。

为了将一系列的写操作从其它的读操作和写操作中分隔开来,请查阅 执行两个阶段的提交

附加方法

在不能根据 _id 字段查找到文档的情况下, db.collection.save() 方法 既可以更新一个现有文档,又可以插入一个新的文档。 请查阅 db.collection.save() 以了解更多信息及示例。

MongoDB也提供了执行批量写操作的方法。请查阅 Bulk() 以了解更多信息。

←   写操作 写关注  →