我正在Go中运行一个网站,我正在使用MGO包来连接我的MongoDB数据库。
我正在处理用户的登录,我正在尝试使用func Upsert()
更新用户(如果他们存在于数据库中),否则插入它们。
问题是,当我运行Upsert()
(下面的代码)时,它会替换所有字段,而不是只更新第二个参数bson.M{}
中的当前字段。
db.C("users").Upsert(
bson.M{"email": "someone@gmail.com"}, // Which doucment to upsert
bson.M{"displayName": "Johhny"}, // What to replace
)
我正在尝试解释的一个视觉示例。
现有的数据库文档:
{
"_id" : ObjectId("58e7589bab64da55ebcf5d25"),
"email" : "someone@gmail.com",
"password" : "",
"age": 69,
"displayName" : "Someone!"
}
跑完后:
db.C("users").Upsert(
bson.M{"email": "someone@gmail.com"},
bson.M{"displayName": "My name was updated"},
)
该文件成为:
{
"_id" : ObjectId("58e789feab64da55ebcf691c"),
"displayName" : "My name was updated"
}
当我期望文件成为:
{
"_id" : ObjectId("58e7589bab64da55ebcf5d25"),
"email" : "someone@gmail.com",
"password" : "",
"age": 69,
"displayName" : "My name was updated" // This should be updated, all others should be left untouched
}
最后我的问题。
如果文档已经存在于MongoDB集合中,我该如何更新,否则插入它?
答案 0 :(得分:4)
如果您尝试使用您提供的字段更新文档并忽略所有其他字段,那么我认为如果没有首先选择,则无法实现。
See this question on stack overflow
编辑: 尝试:
db.C("users").Upsert(
bson.M{"email": "someone@gmail.com"},
bson.M{"$set": bson.M{"displayName": "My name was updated"}},
)