我有一部分要保存到Mongo集合中的对象。假设
type (
User struct {
AccountId string
Name string
FamilyName string
EmailAddress string
}
)
func persistUsers(ctx context.Context, db *mongo.Collection, users []User) {
}
有些用户已经保存,有些则没有。我想重新切片。因此,我有两个问题:
如何使用mongo.Collection.BulkWrite()
?我找不到明显的解释如何将对象切片放入其中。
mongo如何确定新的,旧的和必须更新的?根据{{1}}?
答案 0 :(得分:2)
如何使用mongo.Collection.BulkWrite()?
此示例代码基于MongoDB Go driver v1.1.2。首先,您需要导入以下内容:
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/bson"
下面是Collection.BulkWrite的示例代码,并使用了User
结构示例:
collection := client.Database("databaseName").Collection("collectionName")
var operations []mongo.WriteModel
// Example using User struct
userA := User{AccountId:"1", Name:"John", FamilyName:"Smith", EmailAddress:"john@example.org"}
operationA := mongo.NewUpdateOneModel()
operationA.SetFilter(bson.M{"AccountId": userA.AccountId})
operationA.SetUpdate(bson.M{"Name":userA.Name,
"FamilyName":userA.FamilyName,
"EmailAddress":userA.EmailAddress})
// Set Upsert flag option to turn the update operation to upsert
operationA.SetUpsert(true)
operations = append(operations, operationA)
// Example using bson.M{}
operationB := mongo.NewUpdateOneModel()
operationB.SetFilter(bson.M{"AccountId":2})
operationB.SetUpdate(bson.M{"Name":"Jane",
"FamilyName":"Smith",
"EmailAddress":"jane@example.org"})
operationB.SetUpsert(true)
operations = append(operations, operationB)
// Specify an option to turn the bulk insertion in order of operation
bulkOption := options.BulkWriteOptions{}
bulkOption.SetOrdered(true)
result, err := collection.BulkWrite(context.TODO(), operations, &bulkOption)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
有关更多信息,请参见:
mongo如何确定什么是新的,什么是旧的以及必须更新?
如果没有符合查询条件的文档(过滤器),则update()
将插入一个文档。如果存在符合查询条件的文档,它将成为更新。另请参阅Upsert Behaviour,以了解更多信息。
如果您的更新查询条件包含_id
和dot notation,请参阅Upsert With Dotted _id
Query。