Golang MGO - 插入或更新不按预期工作

时间:2017-04-07 12:52:12

标签: mongodb go upsert

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

1 个答案:

答案 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"}}, )