由于 mgo/txn 中没有 Upsert,所以当我不知道文档是否已经存在时,我会先进行插入,然后再进行更新。像这样(记住这是一个简单的例子,实际上我也会改变不同的文件)——
ops := []txn.Op{{
C: "test",
Id: t.Id,
Insert: t,
}, {
C: "test",
Id: t.Id,
Update: bson.M{"$set": bson.M{"num": 123}},
}}
这工作正常。不幸的是,它需要我确切知道哪些字段已更改。我通常在 Save() 函数中运行它,该函数接收一个对象并保存一堆相关文档,所以我通常不知道哪些字段已更改。我试着做这样的事情——
ops := []txn.Op{{
C: "test",
Id: t.Id,
Insert: t,
}, {
C: "test",
Id: t.Id,
Update:t,
}}
但这似乎不起作用,因为我收到“修饰符和非修饰符不能混合”错误。我想出的唯一解决方案是“$set”每个单独的字段——
ops := []txn.Op{{
C: "test",
Id: t.Id,
Insert: t,
}, {
C: "test",
Id: t.Id,
Update: bson.M{"$set": bson.M{"num": 123}},
}, {
C: "test",
Id: t.Id,
Update: bson.M{"$set": bson.M{"other": 234}},
}}
但这似乎……笨重。我错过了什么吗?有没有办法更新整个文档?