gpt4 book ai didi

mongodb - 用 mgo.txn 模拟更新插入

转载 作者:IT王子 更新时间:2023-10-29 01:43:12 26 4
gpt4 key购买 nike

因为在 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}},
}}

但这似乎...笨重。我错过了什么吗?有没有办法更新整个文档?

最佳答案

虽然这看起来有点可疑,因为您将再次重新发送所有内容,但您可以通过将值本身提供给 $set 来设置值中的每个字段:

    {
C: "test",
Id: t.Id,
Update: bson.M{"$set": t},
}

另请注意,即使您选择手动发送值,也没有理由在多个操作中发送它们;这会起作用:

    {
C: "test",
Id: t.Id,
Update: bson.M{"$set": bson.M{"foo": 1, "bar": 2}},
}

最后,请记住,当您将文档与交易机器一起使用时,它会获得机器本身所必需的额外字段。如果您用一些自定义内容替换整个文档,这些字段将消失,并且 txn 包将无法正常运行。

关于mongodb - 用 mgo.txn 模拟更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24455478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com