在单个操作中插入或更新
Overview
通过本指南,您可以了解如何使用 MongoDB Java 驱动程序执行更新或插入。
应用程序使用插入和更新操作来存储和修改数据。有时,您需要根据文档是否存在,在插入和更新操作之间进行选择。MongoDB通过 upsert
更新或插入选项帮助我们简化了决策流程。
An upsert
:
更新与查询过滤器相匹配的文档
如果没有与查询过滤器匹配的项,则插入一个文档
指定更新或插入
要使用 updateOne()
或 updateMany()
方法指定 upsert,请将 true
传递给 UpdateOptions.upsert()
。
要使用 replaceOne()
方法指定更新或插入,请将 true
传递给 ReplaceOptions.upsert()
。
在以下示例中,一家油漆店销售八种不同颜色的油漆。这家商店举行了一年一度的网上促销活动。他们的 paint_inventory
集合现在显示以下文档:
{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 } { "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 } { "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 } { "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 }
商店收到了新的货物,需要更新其库存。第一批货物是十罐橙色油漆。
要更新此清单,请查询 paint_inventory
集合(其中 color
为 "orange"
),指定一个更新以便将 qty
字段increment
10
,然后将 UpdateOptions.upsert()
指定为 true
:
// Creates a filter and update document to increment the matching document's "qty" value Bson filter = Filters.eq("color", "orange"); Bson update = Updates.inc("qty", 10); // Updates the matching document or inserts a document if none match the query filter UpdateOptions options = new UpdateOptions().upsert(true); System.out.println(collection.updateOne(filter, update, options));
该方法返回:
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=BsonObjectId{ value=606b4cfc1601f9443b5d6978 }}
此 AcknowledgedUpdateResult
告诉我们:
与查询筛选器匹配的文档数为零
集合中无任何文档被修改
一份
_id
为606b4cfc1601f9443b5d6978
的文档更新或插入
下面显示了 paint_inventory
集合中的文档:
{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 } { "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 } { "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 } { "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 } { "_id": { "$oid": "606b4cfc1601f9443b5d6978" }, "color": "orange", "qty": 10 }]
注意
不包括 UpdateOptions
不会导致集合发生任何变化。
Bson filter = Filters.eq("color", "orange"); Bson update = Updates.inc("qty", 10); System.out.println(collection.updateOne(filter, update));
该方法返回:
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=null }
有关本节中提到的方法和类的详情,请参阅以下 API 文档: