更新文档


进入MongoDB中文手册(4.2版本)目录

本章节使用以下Java同步驱动程序方法:

  • com.mongodb.client.MongoCollection.updateOne;
  • com.mongodb.client.MongoCollection.updateMany;
  • com.mongodb.client.MongoCollection.replaceOne。

本章节的示例使用inventory集合。要创建或填充 inventory集合,请运行以下命令:

collection.insertMany(asList(
       Document.parse("{ item: 'canvas', qty: 100, size: { h: 28, w: 35.5, uom: 'cm' }, status: 'A' }"),
       Document.parse("{ item: 'journal', qty: 25, size: { h: 14, w: 21, uom: 'cm' }, status: 'A' }"),
       Document.parse("{ item: 'mat', qty: 85, size: { h: 27.9, w: 35.5, uom: 'cm' }, status: 'A' }"),
       Document.parse("{ item: 'mousepad', qty: 25, size: { h: 19, w: 22.85, uom: 'cm' }, status: 'P' }"),
       Document.parse("{ item: 'notebook', qty: 50, size: { h: 8.5, w: 11, uom: 'in' }, status: 'P' }"),
       Document.parse("{ item: 'paper', qty: 100, size: { h: 8.5, w: 11, uom: 'in' }, status: 'D' }"),
       Document.parse("{ item: 'planner', qty: 75, size: { h: 22.85, w: 30, uom: 'cm' }, status: 'D' }"),
       Document.parse("{ item: 'postcard', qty: 45, size: { h: 10, w: 15.25, uom: 'cm' }, status: 'A' }"),
       Document.parse("{ item: 'sketchbook', qty: 80, size: { h: 14, w: 21, uom: 'cm' }, status: 'A' }"),
       Document.parse("{ item: 'sketch pad', qty: 95, size: { h: 22.85, w: 30.5, uom: 'cm' }, status: 'A' }")
));

1 更新集合中的文档

MongoDB提供了更新操作符来更新文档,例如$set修改字段值。
驱动程序提供com.mongodb.client.model.Updates 类,来更新文档。例如:

combine(set( <field1>, <value1>), set(<field2>, <value2> ) )

有关更新帮助器的列表,请参见com.mongodb.client.model.Updates
如果该字段不存在,某些更新运算符(例如$set)将创建该字段。有关详细信息,请参见各个更新运算符

注意
从MongoDB 4.2开始,MongoDB可以通过聚合管道来指定要进行的修改,而不是更新文档。有关详细信息,请参见方法参考章节。

1.1 更新单个文档

以下示例在集合上使用 com.mongodb.client.MongoCollection.updateOne方法 inventory更新item等于"paper"的第一个文档 :

collection.updateOne(eq("item", "paper"),
        combine(set("size.uom", "cm"), set("status", "P"), currentDate("lastModified")));

更新操作:

  • 使用$se运算符更新size.uom字段的值为"cm"和status字段的值为"P",
  • 使用$currentDate运算符将lastModified字段的值更新为当前日期。如果 lastModified字段不存在, $currentDate将创建该字段。请参见 有关$currentDate详细信息。

1.2 更新多个文档

以下示例在inventory集合上使用com.mongodb.client.MongoCollection.updateMany方法来更新qty小于50的所有文档 :

collection.updateMany(lt("qty", 50),
        combine(set("size.uom", "in"), set("status", "P"), currentDate("lastModified")));

2 替换文档

要替换除_id 字段以外的文档的所有内容,请将一个全新的文档作为第二个参数传递给 com.mongodb.client.MongoCollection.replaceOne。
替换文档时,替换文档必须仅由字段和值成对的组成;即不包括更新运算符的表达式。
替换文档可以具有与原始文档不同的字段。在替换文档中,_id由于该_id字段是不可变的,因此可以省略该字段;但是,如果您包含该_id字段,则该字段必须与当前值具有相同的值。
下面的示例替换inventory集合中item字段的值为"paper"的第一个文档。

collection.replaceOne(eq("item", "paper"),
        Document.parse("{ item: 'paper', instock: [ { warehouse: 'A', qty: 60 }, { warehouse: 'B', qty: 40 } ] }"));

3 行为

3.1 原子性

MongoDB中的所有写操作都是单个文档级别的原子操作。有关MongoDB和原子性的更多信息,请参见原子性和事务

3.2 _id字段

您将无法更新该_id字段的值,也无法将现有文档替换为具有不同_id字段值的文档。

3.3 字段顺序

除以下情况外,MongoDB在写操作后保留文档字段的顺序:

  • _id字段始终是文档中的第一个字段;
  • 包含renaming字段名称的更新可能会导致文档中字段的重新排序。

3.4 Upsert选项

如果更新和替换方法包括指定com.mongodb.client.model.UpdateOptions.upsert(true)的 com.mongodb.client.model.UpdateOptions参数,并且没有文档与指定的过滤器匹配,则该操作将创建一个新文档,并插入它。如果存在匹配的文档,则该操作会修改或替换一个或多个匹配的文档。
有关创建的新文档的详细信息,请参见各个方法的参考章节。

3.5 写确认

对于写入策略,您可以对MongoDB写入操作的请求指定确认级别。有关详细信息,请参见写策略

也可以看看:

进入MongoDB中文手册(4.2版本)目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值