Обновите несколько значений в одном документе в MongoDB, используя C #, используя - PullRequest
0 голосов
/ 07 сентября 2018

Я нахожусь в процессе создания облегченного класса-оболочки для MongoDB, который будет использоваться в моем проекте. Я застрял в точке, где я хочу обновить несколько значений в одном документе. Я не могу найти правильное решение для этого.

Мой документ в MongoDB выглядит следующим образом

_id : "7241b664-4943-4929-bcbf-18726cb74eeb"
Patterns :"Pattern1"
Description :"M1"
Update : "U1"

_id    :    "b6c8beb9-01a5-4a59-b5da-f2ef6501a86b"
Patterns : "Pattern2"
Description  : "M2"
Update  : "U2"

_id    :    "9cd91fa0-3e49-413a-8ad4-c1830aaae841"
Patterns   :  "Pattern3"
Description : "M3"
Update    :    "U3"

_id    :    "b597d1ec-160c-4c2c-8b67-ff36f4aa51ca"
Patterns     :    "Pattern4"
Description    :    "M4"
Update    :    "U4"

Теперь допустим, что я хочу обновить Description и Update поля для

   _id = "7241b664-4943-4929-bcbf-18726cb74eeb"

Я создаю универсальную облегченную библиотеку для MongoDB, и клиенты, использующие ее, не должны зависеть от MongoDB.Driver или BSON или любого из его DLL-файла.

Когда я хочу обновить одно поле для отдельной записи в документе, я могу это сделать. Ниже мой код для этого:

 public void Update<T, Tfield>(string collectionName, Expression<Func<T, bool>> filter, Expression<Func<T, Tfield>> field, Tfield value)
    {
        if (filter == null) throw new ArgumentNullException("filter is empty");
        var collection = GetCollection<T>(collectionName);
        var update = Builders<T>.Update.Set(field, value);
        collection.UpdateMany(filter, update);
    }

Использование этого примерно так:

public void TestMongoUpdate()
    {
        var p = new RegexPatterns();
        var connectionString = "mongodb://localhost:27017";
        var collection = "MessagePatterns";
        //var filter = "{ _id: 'def8437e-d101-453e-a498-05e129b8dd39'}";
        var mongo = new Mongo(connectionString);
        mongo.DatabaseName = "MongoDB";
        var id = "7241b664-4943-4929-bcbf-18726cb74eeb";
        var pattern = new RegexPatterns();
        pattern._id = id;
        pattern.Patterns = "mypattern";
        pattern.Description = "mydesc";
        mongo.Update<RegexPatterns, string>(collection, (x => x._id == id),(y => y.Patterns),pattern.Patterns);
        Assert.True(true);
    }

С помощью вышеуказанного метода тестирования я могу обновить значение Patterns для предоставленного идентификатора. Теперь я хочу обновить поле Patterns и Description для предоставленного идентификатора, но я бьюсь головой об стену, фактически не заставляя этот метод работать для обновления нескольких полей.

Я попытался выполнить приведенный ниже тестовый пример, но он не работает. Я делаю что-то ужасно неправильно.

public void TestMongoUpdateMulti()
    {
        var p = new RegexPatterns();
        var connectionString = "mongodb://localhost:27017";
        var collection = "MessagePatterns";
        //var filter = "{ _id: 'def8437e-d101-453e-a498-05e129b8dd39'}";
        var mongo = new Mongo(connectionString);
        mongo.DatabaseName = "MongoDB";
        var id = "7241b664-4943-4929-bcbf-18726cb74eeb";
        var pattern = new RegexPatterns();
        pattern._id = id;
        pattern.Patterns = "mypattern";
        pattern.Description = "mydesc";
        mongo.Update<RegexPatterns, RegexPatterns>(collection, (x => x._id == id), (y => pattern), pattern);
        Assert.True(true);
    }

Как я могу это исправить?

Это в C # с использованием .NET стандарта 2.0 и последних MongoDB.Driver.

...