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 #?


person dna    schedule 06.06.2016    source источник


Ответы (1)


Ознакомьтесь с позиционным оператором. В этом случае вам не нужна масса, просто UpdateMany.

collection.UpdateMany(
  Builders<RootDocument>.Filter.Eq("Documents.Id", document.Id),
  Builders<RootDocument>.Update.Set("Documents.$", document));

Он пройдет через коллекцию и сопоставит любой RootDocument, у которого есть ChildDocument с указанным идентификатором, и впоследствии заменит его предоставленным документом.

person Craig Wilson    schedule 07.06.2016
comment
Большое тебе спасибо - person dna; 08.06.2016