Mongodb C# массовое обновление / замена в подколлекции
Дана следующая структура объекта:
public class RootDocument
{
public Guid Id { get; set; }
public string SomeProperty { get; set; }
public List<ChildDocument> Documents { get; set; }
}
public class ChildDocument
{
public Guid Id { get; set; }
public string Name { get; set; }
public string SomeProperty { get; set; }
}
Я хочу обновить все ChildDocuments
указанного Id
на все RootDocument
в RootDocument
коллекция.
Идея состоит в том, чтобы обновить их все в массовой операции, например так:
var document = new ChildDocument() { Id = <id of existing ChildDocument>, Name = ..., ...);
var bulkOperations = new WriteModel<RootDocument>[]
{
new UpdateManyModel<RootDocument>(
Builders<RootDocument>.Filter.Eq("Documents.Id", document.id),
Builders<RootDocument>.Update.AddToSet(x => x.Documents, document))
};
await mongoDatabase.GetCollection<RootDocument>()
.BulkWriteAsync(bulkOperations, new BulkWriteOptions { IsOrdered = false });
Но AddToSet
не замена операции существующей ChildDocument
,
Каков наилучший способ с последним драйвером MongoDB C# для реализации этого требования?
1 ответ
Решение
Прочитайте о позиционном операторе. В этом случае вам не нужно много, просто UpdateMany.
collection.UpdateMany(
Builders<RootDocument>.Filter.Eq("Documents.Id", document.Id),
Builders<RootDocument>.Update.Set("Documents.$", document));
Это будет проходить через коллекцию и сопоставлять любой RootDocument, у которого есть ChildDocument с указанным Id, и впоследствии заменять его предоставленным документом.