Я пытаюсь написать простое тестовое приложение CRUD, используя mongodb / mon go - go -driver (v1.2.1), которое подключается к экземпляру Azure CosmosDB (v3.6 ). Рассмотрим следующие фрагменты кода.
Урезанная Update
функция из Client
struct, которая для краткости опущена
func (c *Client) Update(ctx context.Context, filter, update bson.M) error {
res, err := c.collection.UpdateOne(ctx, filter, update, options.Update())
if err != nil {
return Error{ErrFunctional, "failed to update document", err}
}
if res.MatchedCount != 1 {
return Error{
Code: ErrNotFound,
msg: "document not found",
}
}
if res.ModifiedCount != 1 {
return Error{
Code: ErrNotUpdated,
msg: "document not updated",
}
}
return nil
}
Код бегуна выглядит следующим образом
type doc struct {
count int
}
id, err := dbClient.Insert(context.TODO(), doc{1})
if err != nil {
panic(fmt.Errorf("insert failed: %v", err))
}
err = dbClient.Update(context.TODO(), bson.M{"_id": id}, bson.M{"$set": bson.M{"count": 2}})
if err != nil {
panic(fmt.Errorf("update failed: %v", err))
}
err = dbClient.Delete(context.TODO(), bson.M{"_id": id})
if err != nil {
panic(fmt.Errorf("delete failed: %v", err))
}
Как вы видите в коде, я пытаюсь выполнить sh следующие шаги:
- Вставить запись
{"count": 1}
(Это работает правильно, и документ вставлен) - Обновите запись вставки до
{"count": 2}
(Сбой из-за того, что документ не найден) - Удалить запись (Код здесь не доходит)
Программа завершается ошибкой на 2-м шаге. Я проверил результат, возвращенный драйвером, и MatchedCount
и ModifiedCount
всегда равны 0. Однако база данных была обновлена с правильными данными. Странно, правда? Интересно, что если я выполняю те же шаги, используя оболочку MongoDB (CLI, устанавливается с помощью brew), то эти шаги завершаются sh без проблем.
Я попробовал все варианты фильтров и операторов обновления, чтобы заставить его работать, но безрезультатно. У меня такое ощущение, что это связано с драйвером Golang. Что-то я пропускаю или делаю неправильно? Пожалуйста, не стесняйтесь спрашивать дополнительную информацию, и я с удовольствием отредактирую вопрос, чтобы предоставить его.