On this page
db.collection.save()
在本页面
Definition
db.collection.
save
( )- 根据其
document
参数更新现有的document或插入新文档。
- 根据其
save()方法具有以下形式:
在 2.6 版中进行了更改。
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
Parameter | Type | Description |
---|---|---|
document |
document | 要保存到集合的文档。 |
writeConcern |
document | 可选的。表示write concern的文档。省略使用默认的写关注。参见Write Concern。 |
2.6 版中的新功能。
在 2.6 版中进行了更改:save()返回一个包含操作状态的对象。
Returns: | 包含操作状态的WriteResult对象。 |
---|
Behavior
Write Concern
在 2.6 版中进行了更改。
save()方法使用insert或update命令,它们使用默认的write concern。要指定其他写关注点,请在 options 参数中包括写关注点。
Insert
如果文档不包含_id字段,则save()方法将调用insert()方法。在操作期间,mongoShell 程序将创建ObjectId并将其分配给_id
字段。
Note
大多数 MongoDB 驱动程序 Client 端将包含_id
字段并生成ObjectId
,然后再将插入操作发送到 MongoDB。但是,如果 Client 端发送的文档中没有_id
字段,则mongod将添加_id
字段并生成ObjectId
。
Update
如果文档包含_id字段,则save()方法等效于将upsert option设置为true
并将查询谓词放在_id
字段上的更新。
Examples
保存新文档而不指定_id 字段
在以下示例中,save()方法执行插入操作,因为传递给该方法的文档不包含_id
字段:
db.products.save( { item: "book", qty: 40 } )
在插入过程中,shell 将使用唯一的ObjectId值创建_id
字段,该字段已由插入的文档验证:
{ "_id" : ObjectId("50691737d386d8fadbd6b01d"), "item" : "book", "qty" : 40 }
ObjectId
值特定于机器和运行操作的时间。因此,您的值可能与示例中的值不同。
保存指定_id 字段的新文档
在下面的示例中,save()使用upsert:true
执行更新,因为文档包含_id
字段:
db.products.save( { _id: 100, item: "water", qty: 30 } )
因为_id
字段的值在集合中不存在*,所以更新操作将导致文档的插入。这些操作的结果与设置为true
的带有 upsert 选项的 update()方法相同。
该操作将在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
字段包含集合中存在的值,因此该操作将执行更新以替换文档,并生成以下文档:
{ "_id" : 100, "item" : "juice" }
覆盖默认写问题
对副本集的以下操作指定"w: majority"
的write concern和wtimeout
的 5000 毫秒,以使该方法在写入传播到大多数有表决权的副本集成员之后返回,或者该方法在 5 秒钟后超时。
在版本 3.0 中进行了更改:在以前的版本中,majority
引用了副本集的所有成员的大多数,而不是多数投票成员。
db.products.save(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: "majority", wtimeout: 5000 } }
)
WriteResult
在 2.6 版中进行了更改。
save()返回一个WriteResult对象,该对象包含插入或更新操作的状态。有关详细信息,请参见插入的 WriteResult和WriteResult 更新。