Docs 菜单
Docs 主页
/ / /
Java (Sync) 驱动程序
/ / /

在单个操作中插入或更新

在此页面上

  • 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 告诉我们:

  • 与查询筛选器匹配的文档数为零

  • 集合中无任何文档被修改

  • 一份 _id606b4cfc1601f9443b5d6978 的文档更新或插入

下面显示了 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 文档:

  • UpdateOptions.upsert()

  • ReplaceOptions.upsert()

后退

更新文档中的数组