Overview
在本指南中,您可以了解如何执行 更新或插入(upsert)。
样本数据
本指南中的示例将以下 Plant 结构作为 plants 集合中的文档的模型:
type Plant struct { 	Species string 	PlantID int32 `bson:"plant_id"` 	Height  float64 } 
要运行本指南中的示例,请使用以下代码段将样本数据加载到 db.plants 集合中:
coll := client.Database("db").Collection("plants") docs := []interface{}{ 	Plant{Species: "Polyscias fruticosa", PlantID: 1, Height: 27.6}, 	Plant{Species: "Polyscias fruticosa", PlantID: 2, Height: 34.9}, 	Plant{Species: "Ledebouria socialis", PlantID: 1, Height: 11.4}, } result, err := coll.InsertMany(context.TODO(), docs) 
每个文档都包含一种植物的描述,其中包括物种、植物 ID 和高度,与每个文档中的 species、plant_id 和 height 字段对应。
提示
不存在的数据库和集合
如果执行写操作时不存在必要的数据库和集合,服务器会隐式创建这些数据库和集合。
更新插入
应用程序使用插入和更新操作来存储和修改数据。有时,您必须根据文档是否存在,在插入和更新操作之间做出选择。MongoDB 通过更新或插入选项帮助我们简化了决策流程。
更新或插入执行以下操作之一:
- 更新与查询过滤器相匹配的文档 
- 如果没有查询筛选器的匹配项,则插入新文档 
可以通过将 true 传递给以下写入操作方法的选项中的 SetUpsert() 方法来指定更新插入操作:
- UpdateOne()
- UpdateByID()
- UpdateMany()
- ReplaceOne()
- FindOneAndUpdate()
- FindOneAndReplace()
提示
如果您未指定“更新或插入”选项,则当零个文档与您的查询过滤器匹配时,写入操作不会发生任何更改。这相当于将 false 传递给 SetUpsert() 方法。
例子
以下示例执行以下动作:
- 匹配 - species为- "Ledebouria socialis"且- plant_id为- 3的文档
- 将匹配文档的 - height更新为- 8.3
- 如果查询过滤器没有匹配项,则插入此文档 
filter := bson.D{{"species", "Ledebouria socialis"}, {"plant_id", 3}} update := bson.D{{"$set", bson.D{{"species", "Ledebouria socialis"}, {"plant_id", 3}, {"height", 8.3}}}} // Sets the upsert option to true opts := options.UpdateOne().SetUpsert(true) // Updates a documents or inserts a document if no documents are // matched and prints the results result, err := coll.UpdateOne(context.TODO(), filter, update, opts) if err != nil { 	panic(err) } fmt.Printf("Number of documents updated: %v\n", result.ModifiedCount) fmt.Printf("Number of documents upserted: %v\n", result.UpsertedCount) 
Number of documents updated: 0 Number of documents upserted: 1 
如果查询 plants 集合以查看所有文档,则可以看到,由于查询过滤器未匹配任何文档,因此插入了包含指定字段的新文档:
{"species":"Polyscias fruticosa","plant_id":1,"height":27.6} {"species":"Polyscias fruticosa","plant_id":2,"height":34.9} {"species":"Ledebouria socialis","plant_id":1,"height":11.4} {"species":"Ledebouria socialis","plant_id":3,"height":8.3} 
更多信息
要了解有关提到的操作的更多信息,请参阅以下指南:
API 文档
要进一步了解本指南所提及的任何方法或类型,请参阅以下 API 文档: