Я создаю приложение с использованием C# и mongoDB. Я реализовал шаблон репозитория для операций, связанных с данными, в mongoDB.
Однако я ищу эффективный способ обновить объект в mongoDB. В настоящее время мы получаем документ с помощью метода GetByID, затем выполняем манипуляции с памятью и затем вызываем метод сохранения, который обновляет документ на сервере MongoDB.
Participant p = await participantRepo.GetByIdAsync(ParticipantId);
p.SetCreateAuditInfo(user.Id);
p.AddRelation(user.Id);
participantRepo.SaveAsync(p);
Но поскольку мы загружаем документ в память, это не выглядит подходящим способом, когда документ слишком велик или огромен. Есть ли способ напрямую обновить документ на сервере MongoDB





Доступно множество функций для обновления частей существующего документа mongodb.
Пример из документации (http://mongodb.github.io/mongo-csharp-driver/2.7/reference/driver/crud/writing/):
var filter = new BsonDocument("FirstName", "Jack");
var update = Builders<BsonDocument>.Update.Set("FirstName", "John");
(как всегда, также доступна печатная версия).
Здесь вы найдете список доступных операторов: https://docs.mongodb.com/manual/reference/operator/update/
Вы найдете эти операторы, когда взглянете на класс построителя обновлений в C#. Вот пример оператора "установка".
var update = Builders<YourModelClass>.Update.Set(_ => _.Name, "new name");
yourMongoCollection.UpdateOneAsync(_ => _.Id, update);
Какой лучший подход? обновлять часть документа mongo или делать это в памяти?
Как всегда… это зависит от обстоятельств. Использование обновлений происходит быстрее и предотвращает проблемы параллелизма, но при работе со сложными документами и обновлениями могут возникнуть ситуации, когда вы не сможете создать оператор обновления, не зная текущего значения в db. Я лично использую только обновления, но мне пришлось переключиться с дизайна «ef like 'изменить и затем сгенерировать diff'» на использование более точных методов UpdateXy ().
Думаю, документы не должны быть большими. Насколько я знаю, mongodb не позволяет документам быть больше 16 МБ, но чем они меньше, тем лучше.