Неправильный ModifiedCount и MatchedCount с использованием mongodb / mon go - go -драйвера и Azure CosmosDB - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь написать простое тестовое приложение 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 следующие шаги:

  1. Вставить запись {"count": 1} (Это работает правильно, и документ вставлен)
  2. Обновите запись вставки до {"count": 2} (Сбой из-за того, что документ не найден)
  3. Удалить запись (Код здесь не доходит)

Программа завершается ошибкой на 2-м шаге. Я проверил результат, возвращенный драйвером, и MatchedCount и ModifiedCount всегда равны 0. Однако база данных была обновлена ​​с правильными данными. Странно, правда? Интересно, что если я выполняю те же шаги, используя оболочку MongoDB (CLI, устанавливается с помощью brew), то эти шаги завершаются sh без проблем.

Я попробовал все варианты фильтров и операторов обновления, чтобы заставить его работать, но безрезультатно. У меня такое ощущение, что это связано с драйвером Golang. Что-то я пропускаю или делаю неправильно? Пожалуйста, не стесняйтесь спрашивать дополнительную информацию, и я с удовольствием отредактирую вопрос, чтобы предоставить его.

1 Ответ

0 голосов
/ 15 января 2020

Оказывается, это была просто глупая ошибка в строке подключения. По какой-то причине я использовал этот формат.

mongodb://<username>:<password>@<app>.documents.azure.com:10255/?ssl=true&replicaSet=globaldb&maxIdleTimeMS=120000&retrywrites=false"

Изменился на этот формат, и теперь все работает.

mongodb://<username>:<password>@<app>.mongo.cosmos.azure:10255/?ssl=true&replicaSet=globaldb&maxIdleTimeMS=120000&retrywrites=false"

SMH.

...