Você pode tentar algo como abaixo no driver 2.5 com a versão 3.6.
Encontra o documento com
filter
critérios e update
que inclui o novo identificador posicional
para atualizar vários elementos na matriz dentro de UpdateOne
método. $[] atualiza todas as
Tags
arrays para incluir novo item em todas as Categories
variedade. Ele atua como um espaço reservado para atualizar todos os elementos na matriz. Empurre
var filter = Builders<Product>.Filter.Eq("Id", "123");
var update = Builders<Product>.Update.Push("Tags.$[].Categories", "Item 3");
var result = collection.UpdateOne(filter, update);
Puxar
var filter = Builders<Product>.Filter.Eq("Id", "123");
var update = Builders<Product>.Update.Pull("Tags.$[].Categories", "Item 3");
var result = collection.UpdateOne(filter, update);
Informação adicional:
Você pode definir os
ArrayFilters
opções em UpdateOptions
para aplicar critérios de consulta na matriz aninhada para controlar quais elementos atualizar. Por exemplo, para atualizar todas as categorias na matriz Tags onde cada tag tem
Name
nome. var filter = Builders<Product>.Filter.Eq("Id", "123");
var update = Builders<Product>.Update.Push("Tags.$[t].Categories", "Item 3");
var arrayFilters = new List<ArrayFilterDefinition>{ new ArrayFilterDefinition(new BsonDocument("t.Name", "name")) };
var updateOptions = new UpdateOptions({ArrayFilters = arrayFilters});
var result = collection.UpdateOne(filter, update, updateOptions);