Golang MGO-插入或更新无法正常工作

Aci*_*dic 5 upsert go mongodb

我正在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集合中,如何更新它,否则将其插入?

Zak*_*Zak 5

如果您尝试使用您提供的字段更新文档并忽略所有其他字段,那么我认为如果不先选择是不可能的。

请参阅有关堆栈溢出的此问题

编辑: 尝试:

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)