更新文档
您可以使用对象updateOne()
上的方法更新单个文档MongoCollection
。该方法接受一个与您要更新的文档匹配的过滤器和一个指示驱动程序如何更改匹配文档的更新语句。该updateOne()
方法仅更新与过滤器匹配的第一个文档。
要使用该updateOne()
方法执行更新,您必须传递一个查询过滤器和一个更新文档。查询过滤器指定要对其执行更新的文档的标准,更新文档提供有关对其进行哪些更改的说明。
您可以选择将 的实例传递UpdateOptions
给updateOne()
方法以指定方法的行为。例如,如果您将对象的upsert
字段设置UpdateOptions
为true
,则如果没有文档与查询过滤器匹配,则操作将从查询和更新文档中的字段中插入一个新文档。有关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
。我们对匹配文档执行以下更新:
- 将值设置
runtime
为99
- 仅当它不存在时才添加
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()
方法执行更新,您必须传递一个查询过滤器和一个更新文档。查询过滤器指定要匹配集合中的哪些文档,更新文档提供有关对它们进行哪些更改的说明。
您可以选择将 的实例传递UpdateOptions
给updateMany()
方法,以修改调用的行为。例如,如果您将对象的upsert
字段设置 UpdateOptions
为true
并且没有文档与指定的查询过滤器匹配,则该操作会插入一个由来自查询和更新文档的字段组成的新文档。
成功执行后,该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()
方法仅替换与过滤器匹配的第一个文档。
您可以选择将 的实例传递ReplaceOptions
给replaceOne()
方法以指定方法的行为。例如,如果您将对象的upsert
字段设置ReplaceOptions
为true
,则如果没有文档与查询过滤器匹配,则操作会从替换文档的字段中插入一个新文档。有关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()
操作运行之前,原始文档包含几个描述电影的字段。操作运行后,生成的文档仅包含由替换文档 (title
和fullplot
) 和字段指定的_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, 请参阅我们的常见问题解答页面 以了解您需要对此代码示例进行哪些更改。
官网地址:https://docs.mongodb.com/drivers/java/sync/current/usage-examples/updateOne/