Я нахожусь в процессе создания облегченного класса-оболочки для 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
.