首页 > 解决方案 > 如何使用 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"`
}

但是,我需要使用personstruct 调用更新函数,而无需像这样提及 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 文档?

标签: mongodbgodrivercrud

解决方案


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 计数。


推荐阅读