golang mon go - go -драйвер не может увеличить ранее нулевое значение - PullRequest
1 голос
/ 06 мая 2020

Мне нужно выполнить такой запрос. Выполнение этого запроса вручную возвращает OK с upsertedCount = 1, когда ключ не существует

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)

К сожалению, этот запрос возвращает ошибка

multiple write errors: [{write errors: [{Cannot increment with non-numeric argument: {key: "Version"}}]}, {<nil>}]

Почему не работает? Кажется, что драйвер пытается увеличить его, не отправляя его в mon go

Edit:

  1. измените регистр схемы на Upper, чтобы следовать go код
  2. Использовать более простую версию кода

1 Ответ

1 голос
/ 06 мая 2020

Проблема с вашим значением docs. Это должен быть действующий документ. bson.D является действительным документом, если все его элементы действительны. В нем есть элемент с ключом $inc, который требует, чтобы его значение также было действительным документом. 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)
...