Обновить все поля, переданные в объекте, без использования замены - PullRequest
2 голосов
/ 06 мая 2019

Я пишу оболочку для определенных функций mongodb, чтобы обеспечить соблюдение определенных политик ведения бизнеса (таких как дата последнего изменения, версия документа и т. Д.). Эти дополнительные поля не будут отображаться в модели и будут неактуальными и прозрачными для лица, реализующего эту библиотеку. Эта библиотека будет общей.

Поэтому использование replaceOne исключено.

Мне бы хотелось, чтобы какой-то способ передачи всех полей объекта, переданного человеком, в построитель обновлений, поэтому я могу соответственно использовать .Set / .Inc для добавления других полей.

Ниже приведен пример, демонстрирующий, что я хочу:

public static async Task UpdatePerson(string name, Person person)
    {
        var client = new MongoClient("mongodb://localhost:27017");
        IMongoDatabase db = client.GetDatabase("test");

        IMongoCollection<Person> collection = db.GetCollection<Person>("people");

        var query = Builders<Person>.Filter
        .Eq("name", name);

        var update = Builders<Person>.Update
        //Something here - how do I pass my person's properties?
        .Set("lastModified", DateTime.Now)
        .Inc("version",1);

        await collection.UpdateOneAsync(query, update );
    }

//--

//In real life this'll work for other types, this is for demonstration only
public class Person
    {
        public string name {get;set;}
        public string surname {get;set;}
}

Итак, как я могу это сделать, например, не просматривая свойства с помощью Reflection?

1 Ответ

2 голосов
/ 10 мая 2019

Не уверен, что вы можете это сделать, но драйвер Mongodb предоставляет что-то под названием [BsonExtraElements].

public class Person
{
    public string name {get;set;}
    public string surname {get;set;}
    [BsonExtraElements]
    public Dictionary<string,object> AdditionalFields { get; set; }
}

Что произойдет, так это то, что все, что не может быть сериализовано в модель, будет добавлено в этот словарь, независимо от типа. Вы можете добавить к нему также и удалить.

Это не добавит дополнительных затрат в вашу базу данных. Единственным недостатком этого является то, что запросы к этому словарю не очень удобны, так как вам может потребоваться привести конкретные ключи к соответствующим им ожидаемым типам.

Если это невозможно, я предлагаю подход BSON, рекомендованный Саймоном.

...