我正在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
)
Run Code Online (Sandbox Code Playgroud)
我要解释的视觉示例。
现有的数据库文档:
{
"_id" : ObjectId("58e7589bab64da55ebcf5d25"),
"email" : "someone@gmail.com",
"password" : "",
"age": 69,
"displayName" : "Someone!"
}
Run Code Online (Sandbox Code Playgroud)
运行后:
db.C("users").Upsert(
bson.M{"email": "someone@gmail.com"},
bson.M{"displayName": "My name was updated"},
)
Run Code Online (Sandbox Code Playgroud)
该文档变为:
{
"_id" : ObjectId("58e789feab64da55ebcf691c"),
"displayName" : "My name was updated"
}
Run Code Online (Sandbox Code Playgroud)
当我期望文档成为:
{
"_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
}
Run Code Online (Sandbox Code Playgroud)
最后是我的问题。
如果文档已存在于MongoDB集合中,如何更新它,否则将其插入?
如果您尝试使用您提供的字段更新文档并忽略所有其他字段,那么我认为如果不先选择是不可能的。
编辑: 尝试:
db.C("users").Upsert(
bson.M{"email": "someone@gmail.com"},
bson.M{"$set": bson.M{"displayName": "My name was updated"}},
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5414 次 |
| 最近记录: |