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, и впоследствии заменять его предоставленным документом.

Другие вопросы по тегам