2016-06-06 3 views
2

Следующая структура объекта Дано: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# для реализации этого требования?

ответ

2

Прочитать positional operator. В этом случае вам не нужно массовое количество, просто UpdateMany.

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

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

+0

Большое спасибо – dna

 Смежные вопросы

  • Нет связанных вопросов^_^