mongodb - 如何使用 struct 使用 mongo-go-driver 的更新功能
问题描述
mongo-go-driver的update函数可以这样调用。
filter := bson.D{"username", username}
update := bson.D{{"$set",
bson.D{
{"name", person.Name},
},
}}
result, err := collection.UpdateOne(ctx, filter, update)
type Person struct {
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
Username string `json:"username,omitempty" bson:"username,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
}
但是,我需要使用person
struct 调用更新函数,而无需像这样提及 person struct 的每个字段。
filter := bson.D{"username", username}
update := bson.D{{"$set", <<how to convert person struct to bson document?>>}}
result, err := collection.UpdateOne(ctx, filter, update)
如何将 person 结构转换为 bson 文档?
解决方案
ReplaceOne
我认为这就是你所追求的:
// Use it's ID to replace
filter := bson.M{"_id": existing.ID}
// Create a replacement object using the existing object
replacementObj := existing
replacementObj.SomeFieldToChange = "new-replacement-object"
updateResult, err := coll.ReplaceOne(context.Background(), filter, replacementObj)
assertNotErr(t, err)
assertEquals(t, 1, int(updateResult.ModifiedCount))
注意 ErrNotFound 不再像在 mgo 中那样被抛出 - 你必须检查 Modified/Upserted 计数。
推荐阅读
- ios - 从 Android 调用 Sinch Callkit 项目?
- android - 如何将 firebase 测试实验室与 circleci 集成
- c# - 无法在 while 循环 C# 中激活布尔值或停用它们
- c# - Url.Action 未命中控制器方法
- realm - 如何将 Realm Cloud 匿名用户转换为真实用户
- javascript - 使用 python Crypto.Cipher 进行 AES 解密
- python - 从文本文件中提取特征并将它们训练到分类器
- php - 在 PHP 中使用 Spot ORM 时出错
- android - 如何将 Bitmap 对象转换为 android.media.Image 对象?
- javascript - 调用 response.json() 时获取错误