更新文档

您可以使用对象updateOne()方法更新单个文档MongoCollection该方法接受一个与您要更新的文档匹配的过滤器和一个指示驱动程序如何更改匹配文档更新语句。updateOne()方法仅更新与过滤器匹配的第一个文档。

要使用该updateOne()方法执行更新,您必须传递一个查询过滤器和一个更新文档。查询过滤器指定要对其执行更新的文档的标准,更新文档提供有关对其进行哪些更改的说明。

您可以选择将 的实例传递UpdateOptionsupdateOne()方法以指定方法的行为。例如,如果您将对象upsert字段设置UpdateOptionstrue,则如果没有文档与查询过滤器匹配,则操作将从查询和更新文档中的字段中插入一个新文档。有关UpdateOptions更多信息,请参阅本页底部API 文档链接

成功执行后,该updateOne()方法返回 的实例UpdateResult如果您实例中指定您可以检索诸如通过调用该getModifiedCount()方法修改的文档数量_id通过调用该getUpsertedId()方法获取字段值等信息upsert(true)UpdateOptions

如果更新操作失败,驱动程序会引发异常。例如,如果您尝试为_id更新文档中的不可变字段设置一个值,该方法会抛出MongoWriteException带有消息的 a:

Performing an update on the path '_id' would modify the immutable field '_id'

 

 

如果您的更新文档包含违反唯一索引规则的更改,则该方法会抛出MongoWriteException带有错误消息的错误消息,该消息应如下所示:

E11000 duplicate key error collection: ...

 

有关在特定条件下引发的异常类型的更多信息,请参阅updateOne()本页底部链接的 API 文档

在此示例中,我们更新数据库movies 集合中查询的第一个匹配项sample_mflix我们对匹配文档执行以下更新:

  • 将值设置runtime99
  • 仅当它不存在时才添加Sports到数组genres
  • 将 的值设置为lastUpdated当前时间。

我们使用Updates构建器(一个包含静态辅助方法的工厂类)来构造更新文档。虽然您可以传递更新文档而不是使用构建器,但构建器提供了类型检查和简化的语法。有关Updates构建器的更多信息,请参阅我们 的更新构建器指南

笔记

此示例使用连接字符串连接到 MongoDB 实例。要了解有关连接到 MongoDB 实例的更多信息,请参阅 连接指南

package usage.examples;
import org.bson.Document; import org.bson.conversions.Bson; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.model.Updates; import com.mongodb.client.result.UpdateResult;
public class UpdateOne { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); Document query = new Document().append("title", "Cool Runnings 2"); Bson updates = Updates.combine( Updates.set("runtime", 99), Updates.addToSet("genres", "Sports"), Updates.currentTimestamp("lastUpdated")); UpdateOptions options = new UpdateOptions().upsert(true); try { UpdateResult result = collection.updateOne(query, updates, options); System.out.println("Modified document count: " + result.getModifiedCount()); System.out.println("Upserted id: " + result.getUpsertedId()); // only contains a value when an upsert is performed } catch (MongoException me) { System.err.println("Unable to update due to an error: " + me); } } } }

 

运行示例后,您应该会看到如下所示的输出:

Modified document count: 1
Upserted id: null

或者,如果示例导致 upsert:

Modified document count: 0
Upserted id: BsonObjectId{value=...}

如果您查询更新后的文档,它应该如下所示:

Document {
  { _id=...,
    plot=...,
    genres=[Adventure, Comedy, Family, Sports],
    runtime=99,
    ...
    lastUpdated=Timestamp{...}
  }
}

 

更新多个文档

您可以使用对象updateMany()方法更新多个文档MongoCollection该方法接受一个与您要更新的文档匹配的过滤器和一个指示驱动程序如何更改匹配文档更新语句。updateMany()方法更新集合中与过滤器匹配的所有文档。

要使用该updateMany()方法执行更新,您必须传递一个查询过滤器和一个更新文档。查询过滤器指定要匹配集合中的哪些文档,更新文档提供有关对它们进行哪些更改的说明。

您可以选择将 的实例传递UpdateOptionsupdateMany()方法,以修改调用的行为。例如,如果您将对象upsert字段设置 UpdateOptionstrue并且没有文档与指定的查询过滤器匹配,则该操作会插入一个由来自查询和更新文档的字段组成的新文档。

成功执行后,该updateMany()方法返回 的实例UpdateResult您可以通过调用该getModifiedCount()方法来检索诸如修改的文档数量之类的信息如果upsert(true)UpdateOptions对象中指定并且操作导致插入,则可以_id通过调用实例getUpsertedId()上的方法 来检索新文档字段UpdateResult

如果更新操作失败,驱动程序会引发异常并且不会更新任何与过滤器匹配的文档。例如,如果您尝试为_id更新文档中的不可变字段设置值,则该 updateMany()方法不会更新任何文档并抛出 MongoWriteException带有消息的 a:

Performing an update on the path '_id' would modify the immutable field '_id'

 

 

如果您的更新文档包含违反唯一索引规则的更改,则该方法会抛出MongoWriteException带有错误消息的错误消息,该消息应如下所示:

E11000 duplicate key error collection: ...

 

有关在特定条件下引发的异常类型的更多信息,请参阅updateMany()本页底部链接的 API 文档

在这个例子中,我们更新数据库movies 集合中与我们的查询相匹配的文档sample_mflix我们对匹配的文档执行以下更新:

  • 仅当它不存在时才添加Frequently Discussed到数组genres
  • 将 的值设置为lastUpdated当前时间。

我们使用Updates构建器,一个包含静态辅助方法的工厂类来构造更新文档。虽然您可以传递更新文档而不是使用构建器,但构建器提供了类型检查和简化的语法。在构建器部分阅读我们的 更新指南以获取更多信息。

笔记

此示例使用连接字符串连接到 MongoDB 实例。要了解有关连接到 MongoDB 实例的更多信息,请参阅 连接指南

package usage.examples;
import static com.mongodb.client.model.Filters.gt; import org.bson.Document; import org.bson.conversions.Bson; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Updates; import com.mongodb.client.result.UpdateResult;
public class UpdateMany { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); Bson query = gt("num_mflix_comments", 50); Bson updates = Updates.combine( Updates.addToSet("genres", "Frequently Discussed"), Updates.currentTimestamp("lastUpdated")); try { UpdateResult result = collection.updateMany(query, updates); System.out.println("Modified document count: " + result.getModifiedCount()); } catch (MongoException me) { System.err.println("Unable to update due to an error: " + me); } } } }

 

运行示例后,您应该会看到如下所示的输出:

Modified document count: 53

如果您查询更新的一个或多个文档,它们应该如下所示:

[
  Document {
    { _id=...,
      plot=...,
      genres=[..., Frequently Discussed, ...],
      ...
      lastUpdated=Timestamp{...}
    }
  },
  ...
]

 

替换文档

您可以使用对象replaceOne()方法替换单个文档MongoCollection此方法从文档(_id字段除外)中删除所有现有字段和值,并将其替换为您的替换文档。

replaceOne()方法接受一个与您要替换的文档相匹配的查询过滤器,以及一个包含您要保存以代替匹配文档的数据的替换文档。replaceOne() 方法仅替换与过滤器匹配的第一个文档。

您可以选择将 的实例传递ReplaceOptionsreplaceOne()方法以指定方法的行为。例如,如果您将对象upsert 字段设置ReplaceOptionstrue,则如果没有文档与查询过滤器匹配,则操作会从替换文档的字段中插入一个新文档。有关ReplaceOptions更多信息,请参阅本页底部API 文档链接

成功执行后,该replaceOne()方法返回 的实例UpdateResult您可以通过调用该getModifiedCount()方法来检索诸如修改的文档数量之类的信息如果您在 实例中设置并且操作导致插入新文档,您还可以_id通过调用该getUpsertedId()方法来检索文档字段 的值upsert(true)ReplaceOptions

如果替换操作失败,驱动程序会引发异常。例如,如果您尝试为_id替换文档中的不可变字段指定一个 与原始文档不同的值,该方法将抛出MongoWriteException带有消息的 a:

After applying the update, the (immutable) field '_id' was found to have been altered to _id: ObjectId('...)

 

如果您的替换文档包含违反唯一索引规则的更改,则该方法会抛出MongoWriteException带有错误消息的错误消息,该消息应如下所示:

E11000 duplicate key error collection: ...

 

有关在特定条件下引发的异常类型的更多信息,请参阅replaceOne()本页底部链接的 API 文档

在此示例中,我们将数据库movies集合中查询过滤器的第一个匹配项 sample_mflix替换为替换文档。除了字段之外的所有_id字段都从原始文档中删除,并由替换文档替换。

replaceOne()操作运行之前,原始文档包含几个描述电影的字段。操作运行后,生成的文档仅包含由替换文档 (titlefullplot) 和字段指定_id字段。

以下代码段使用以下对象和方法:

  • 查询过滤器传递给该replaceOne()方法。eq 过滤器只匹配电影的标题文本完全匹配 'Music of the Heart'
  • 一个替代文件包含如果它存在,它取代了匹配文档的文档。
  • 一个ReplaceOptions与对象upsert选项设置为true此选项指定如果查询过滤器不匹配任何文档,则该方法应插入替换文档中包含的数据。
笔记

此示例使用连接字符串连接到 MongoDB 实例。要了解有关连接到 MongoDB 实例的更多信息,请参阅 连接指南

package usage.examples;
import static com.mongodb.client.model.Filters.eq; import org.bson.Document; import org.bson.conversions.Bson; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.ReplaceOptions; import com.mongodb.client.result.UpdateResult;
public class ReplaceOne { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); Bson query = eq("title", "Music of the Heart"); Document replaceDocument = new Document(). append("title", "50 Violins"). append("fullplot", " A dramatization of the true story of Roberta Guaspari who co-founded the Opus 118 Harlem School of Music"); ReplaceOptions opts = new ReplaceOptions().upsert(true); UpdateResult result = collection.replaceOne(query, replaceDocument, opts); System.out.println("Modified document count: " + result.getModifiedCount()); System.out.println("Upserted id: " + result.getUpsertedId()); // only contains a value when an upsert is performed } catch (MongoException me) { System.err.println("Unable to replace due to an error: " + me); } } }

 

运行示例后,您应该会看到如下所示的输出:

Modified document count: 1
Upserted id: null

或者,如果示例导致 upsert:

Modified document count: 0
Upserted id: BsonObjectId{value=...}

如果您查询被替换的文档,它应该如下所示:

Document {
  { _id=...,
    title=50 Violins,
    fullplot=A dramatization of the true story of Roberta Guaspari who co-founded the Opus 118 Harlem School of Music
  }
}

 

 

提示
传统 API

如果您使用的是旧 API, 请参阅我们的常见问题解答页面 以了解您需要对此代码示例进行哪些更改。

 

官网地址:https://docs.mongodb.com/drivers/java/sync/current/usage-examples/updateOne/