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

标签 mongodb go upsert

我在 Go 中运行一个网站,我正在使用 MGO用于连接我的 MongoDB 数据库的包。

我正在处理用户的登录,我正在尝试使用函数 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 集合中,我如何更新文档,否则将其插入?

最佳答案

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

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

关于mongodb - Golang MGO - 插入或更新未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43278696/

相关文章:

mongodb - 如果发生故障的服务器从故障转移返回,会发生什么情况?

go - 我可以在 Go 中使用 unsafe.Pointer 将 *interface{} 转换为 *int

image - 为什么来自 Bild 的 jpeg.Decode(bytes.NewReader(imageBytes)) 和 jpeg.Encode(buf, img, nil) 占用大量 CPU?

多个 UNIQUE 字段的 ON DUPLICATE KEY UPDATE 的 MySQL 行为

mongodb - 无法授权 Azure 上的 MongoLab 服务

javascript - MongoDB 无法更新文档,因为 _id 是字符串,而不是 ObjectId

go - 使用zap时如何自定义日志格式?

sql - Oracle PLS-00103 错误。您如何检查现有记录并根据该条件进行更新或插入?

postgresql - UPSERT 测试代码中的语法错误

mongodb - 两个数据中心,连接中断,都继续写入,连接返回,同步?