golang mongo-go-driver 无法增加以前的 nil 值
golang mongo-go-driver can't increment a previously nil value
我对运行有这样的疑问。 运行 手动查询 return 当键不存在时 upsertedCount = 1 OK
db.test.update({Key: 'random-id'}, {$inc: {Version: 1}},{upsert: true})
我尝试将其转换为下面的 mongodb golang 版本
client, _ := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017/"))
coll := client.Database("test").Collection("test")
filter := bson.D{bson.E{"Key", "random-id"}}
docs := bson.D{bson.E{"$inc", bson.E{"Version", 1}}}
upsert := true
result, err := coll.UpdateOne(
context.TODO(),
filter, docs,
&options.UpdateOptions{Upsert: &upsert})
if err != nil {
panic(err)
}
fmt.Print(result)
不幸的是,这个查询 returns 错误
multiple write errors: [{write errors: [{Cannot increment with non-numeric argument: {key: "Version"}}]}, {<nil>}]
为什么不行?似乎驱动程序试图在不将其发送到 mongo
的情况下增加它
编辑:
- 将模式大小写更改为 Upper,以遵循 go 代码
- 使用更简单的代码版本
问题出在您的 docs
值上。它应该是一个有效的文件。 bson.D
is a valid document if all its elements are valid. It has an element with $inc
key, which requires its value to be a valid document too. bson.E
不是文档,它是文档的一个元素。
将您的 docs
更改为:
docs := bson.D{bson.E{"$inc", bson.D{bson.E{"Version", 1}}}}
它会起作用。
如果顺序不重要(不是你的情况),或者你可以使用 bson.M
来模拟你的 filter
和 docs
像这样:
filter := bson.M{"Key": "random-id"}
docs := bson.M{
"$inc": bson.M{"Version": 1},
}
这样更简单、更清晰、更直观。
另请注意,选项有生成器。像这样安全、惯用和清晰地获取您的 options.UpdateOptions
值:
options.Update().SetUpsert(true)
我对运行有这样的疑问。 运行 手动查询 return 当键不存在时 upsertedCount = 1 OK
db.test.update({Key: 'random-id'}, {$inc: {Version: 1}},{upsert: true})
我尝试将其转换为下面的 mongodb golang 版本
client, _ := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017/"))
coll := client.Database("test").Collection("test")
filter := bson.D{bson.E{"Key", "random-id"}}
docs := bson.D{bson.E{"$inc", bson.E{"Version", 1}}}
upsert := true
result, err := coll.UpdateOne(
context.TODO(),
filter, docs,
&options.UpdateOptions{Upsert: &upsert})
if err != nil {
panic(err)
}
fmt.Print(result)
不幸的是,这个查询 returns 错误
multiple write errors: [{write errors: [{Cannot increment with non-numeric argument: {key: "Version"}}]}, {<nil>}]
为什么不行?似乎驱动程序试图在不将其发送到 mongo
的情况下增加它编辑:
- 将模式大小写更改为 Upper,以遵循 go 代码
- 使用更简单的代码版本
问题出在您的 docs
值上。它应该是一个有效的文件。 bson.D
is a valid document if all its elements are valid. It has an element with $inc
key, which requires its value to be a valid document too. bson.E
不是文档,它是文档的一个元素。
将您的 docs
更改为:
docs := bson.D{bson.E{"$inc", bson.D{bson.E{"Version", 1}}}}
它会起作用。
如果顺序不重要(不是你的情况),或者你可以使用 bson.M
来模拟你的 filter
和 docs
像这样:
filter := bson.M{"Key": "random-id"}
docs := bson.M{
"$inc": bson.M{"Version": 1},
}
这样更简单、更清晰、更直观。
另请注意,选项有生成器。像这样安全、惯用和清晰地获取您的 options.UpdateOptions
值:
options.Update().SetUpsert(true)