mongo-go-driver的更新功能可以这样调用。
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
结构调用更新函数,而无需提及人员结构的每个字段。
filter := bson.D{"username", username}
update := bson.D{{"$set", <<how to convert person struct to bson document?>>}}
result, err := collection.UpdateOne(ctx, filter, update)
如何将人员结构转换为bson文档?
答案 0 :(得分:1)
将人的结构编组为bson怎么样?
package main
import (
"fmt"
"labix.org/v2/mgo/bson"
)
type person struct {
ID string `json:"_id,omitempty" bson:"_id,omitempty"`
Username string `json:"username,omitempty" bson:"username,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
}
func main() {
p := person{
ID: "id",
Username: "uname",
Name: "name",
}
var (
bm []byte
err error
)
if bm, err = bson.Marshal(p); err != nil {
panic(fmt.Errorf("can't marshal:%s", err))
}
update := bson.D{{"$set", bm}}
fmt.Printf("update is:%q\n", update)
}
运行:
./sobson
update is:[{"$set" "4\x00\x00\x00\x02_id\x00\x03\x00\x00\x00id\x00\x02username\x00\x06\x00\x00\x00uname\x00\x02name\x00\x05\x00\x00\x00name\x00\x00"}]
答案 1 :(得分:0)
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))
请注意,不再像在mgo中那样抛出ErrNotFound-您必须检查“已修改/已插入”计数。
答案 2 :(得分:0)
您可以执行以下操作:
func Update(person Person) error {
pByte, err := bson.Marshal(person)
if err != nil {
return err
}
var update bson.M
err = bson.Unmarshal(pByte, &update)
if err != nil {
return
}
// NOTE: filter and ctx(Context) should be already defined
_, err = collection.UpdateOne(ctx, filter, bson.D{{Key: "$set", Value: update}})
if err != nil {
return err
}
return nil
}