db.collection.save()

在本页面

定义

  • db.collection. save ()

更新现有的文献或插入新文档,具体取决于其document参数。

注意

MongoDB弃用该db.collection.save()方法。而是使用db.collection.insertOne()db.collection.replaceOne()代替。

save()方法具有以下形式:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
参数
类型
描述

document

document

要保存到集合的文档。

writeConcern

document

可选的。表示写关注的文件。省略使用默认写入问题。见写关注。 如果在事务中运行,请不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。

save()返回包含操作的状态的对象。

返回:

包含操作状态的写结果 object。

行为

写关注

save()方法使用插入或更新命令,它使用默认的写关注。要指定其他写关注点,请在 options 参数中包含写入关注点。

插入

如果文档不包含_id字段,则save()方法 calls insert()方法。在操作期间,mongo shell 将创建ObjectId并将其分配给_id字段。

注意

大多数 MongoDB 驱动程序 clients 将包含_id字段并在将 insert 操作发送到 MongoDB 之前生成ObjectId;但是,如果 client 发送没有_id字段的文档,则mongod将添加_id字段并生成ObjectId

更新

如果文档包含_id字段,则save()方法等效于upsert 选项设置为true_id字段上的查询谓词的更新。

事务

db.collection.save()可以在多文档交易中使用。

如果该操作导致插入,则该集合必须已经存在。

如果在事务中运行,请不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。

重要

在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应替代有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)将继续是您的数据和用例的最佳选择。也就是说,在许多情况下,适当地对数据建模将最大程度地减少对多文档交易的需求。

有关其他事务使用方面的注意事项(例如运行时限制和操作日志大小限制),另请参见 生产注意事项。

例子

保存新文档而不指定_id 字段

在下面的示例中,save()方法执行 insert,因为传递给该方法的文档不包含_id字段:

db.products.save( { item: "book", qty: 40 } )

在 insert 期间,shell 将创建具有唯一ObjectId value 的_id字段,由插入的文档验证:

{ "_id" : ObjectId("50691737d386d8fadbd6b01d"), "item" : "book", "qty" : 40 }

当操作为 run 时,ObjectId值特定于机器和 time。因此,您的值可能与 example 中的值不同。

保存新文档指定_id 字段

在下面的示例中,save()使用upsert:true执行更新,因为文档包含_id字段:

db.products.save( { _id: 100, item: "water", qty: 30 } )

由于_id字段包含集合中不存在的 value,因此更新操作会导致插入文档。这些操作的结果与带有 upsert 选项的 update()方法设置为true相同。

该操作导致products集合中的以下新文档:

{ "_id" : 100, "item" : "water", "qty" : 30 }

替换现有文档

products集合包含以下文档:

{ "_id" : 100, "item" : "water", "qty" : 30 }

save()方法使用upsert:true执行更新,因为文档包含_id字段:

db.products.save( { _id : 100, item : "juice" } )

由于_id字段包含集合中存在的 value,因此操作会执行更新以替换文档并生成以下文档:

{ "_id" : 100, "item" : "juice" }

覆盖默认写入关注

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

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

写结果

save()返回一个WriteResult包含插入或更新操作的状态对象。有关详细信息,请参见WriteResult以获得插入信息,并 参见 WriteResult以获得更新信息。

译者:李冠飞

校对:

最后更新于