Docs Menu
Docs Home
/ /

Actualizar matrices en muchos documentos

En esta página podrás aprender a crear UpdateDefinition Objetos para campos de matriz. Un objeto UpdateDefinition especifica el tipo de operación de actualización que se realizará, los campos que se actualizarán y el nuevo valor para cada campo, si corresponde.

El controlador .NET/C# admite los operadores y modificadores de actualización de matriz descritos en Manual del servidor MongoDB. Para crear un UpdateDefinition objeto para uno de estos operadores, llame al método correspondiente desde la Builders.Update propiedad. Las siguientes secciones describen estos métodos con más detalle.

Después de crear un objeto UpdateDefinition, páselo al método UpdateMany() o UpdateManyAsync(). Para obtener más información sobre estos métodos, consulte Actualizar muchas páginas.

Nota

Sobrecargas de métodos

Muchos de los métodos en esta página tienen varias sobrecargas. Los ejemplos de esta guía muestran solo una definición de cada método. Para obtener más información sobre las sobrecargas disponibles, se puede consultar la documentación de la API.

Los ejemplos de esta guía utilizan la colección restaurants de la base de datos sample_restaurants. Los documentos de esta colección utilizan las siguientes clases Restaurant, Address y GradeEntry como modelos:

public class Restaurant
{
public ObjectId Id { get; set; }
public string Name { get; set; }
[BsonElement("restaurant_id")]
public string RestaurantId { get; set; }
public string Cuisine { get; set; }
public Address Address { get; set; }
public string Borough { get; set; }
public List<GradeEntry> Grades { get; set; }
}
public class Address
{
public string Building { get; set; }
[BsonElement("coord")]
public double[] Coordinates { get; set; }
public string Street { get; set; }
[BsonElement("zipcode")]
public string ZipCode { get; set; }
}
public class GradeEntry
{
public DateTime Date { get; set; }
public string Grade { get; set; }
public float? Score { get; set; }
}

Nota

Los documentos de la colección restaurants utilizan la convención de nomenclatura snake-case. Los ejemplos de esta guía utilizan un ConventionPack para deserializar los campos de la colección en notación Pascal y asignarlos a las propiedades de la clase Restaurant.

Para aprender más sobre la serialización personalizada, consultar Serialización personalizada.

Esta colección es de los conjuntos de datos de muestra proporcionados por Atlas. Consulte Primeros pasos con el controlador .NET/C# para aprender a crear un clúster gratuito de MongoDB y cargar estos datos de muestra.

Para añadir un valor al final de una matriz, llame al método Builders.Update.Push(). Este método acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo de la matriz al que se agregará un valor.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

value

El valor que se agregará al final del campo de la matriz.

Tipo de dato: TItem

El siguiente ejemplo de código utiliza el método Push() para agregar un nuevo objeto GradeEntry a la matriz Grades en todos los documentos coincidentes:

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var update = Builders<Restaurant>.Update
.Push(restaurant => restaurant.Grades, new GradeEntry()
{
Date = DateTime.Now,
Grade = "A",
Score = 96
});
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var update = Builders<Restaurant>.Update
.Push(restaurant => restaurant.Grades, new GradeEntry()
{
Date = DateTime.Now,
Grade = "A",
Score = 96
});
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Tip

Configurar la operación de inserción

Para agregar un valor en una posición específica en una matriz, o para ordenar o dividir la matriz después de actualizarla, llame al método PushEach() en su lugar.

Para agregar un valor al final de un arreglo, pero solo si aún no existe en el arreglo, llame al método Builders.Update.AddToSet(). El MongoDB Server determina si el valor ya existe en el arreglo comparando la representación BSON del valor con la representación BSON de cada otro elemento en el arreglo.

El método AddToSet() acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo de la matriz al que se agregará un valor.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

value

El valor que se agregará al final del campo de la matriz.

Tipo de dato: TItem

El siguiente ejemplo de código llama al método AddToSet() para volver a agregar el primer objeto GradeEntry a la matriz Grades en todos los documentos coincidentes. Dado que el valor ya existe en la matriz, la operación de actualización no realiza ningún cambio.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var firstGradeEntry = _restaurantsCollection.Find(filter).FirstOrDefault().Grades[0];
var update = Builders<Restaurant>.Update
.AddToSet(restaurant => restaurant.Grades, firstGradeEntry);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var firstGradeEntry = _restaurantsCollection.Find(filter).FirstOrDefault().Grades[0];
var update = Builders<Restaurant>.Update
.AddToSet(restaurant => restaurant.Grades, firstGradeEntry);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Para agregar varios valores a una matriz, llame al método Builders.Update.PushEach(). Este método acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo de matriz al que se agregará uno o más valores.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

values

Los valores que se agregarán al campo de matriz.

Tipo de dato: IEnumerable<TItem>

slice

El número de elementos que se conservarán en la matriz, contados desde el inicio de la matriz después de las actualizaciones. Si el valor es negativo, el método conserva el número especificado de elementos desde el final de la matriz.

Tipo de dato: int?

position

La posición en la matriz donde se agregarán los valores. Por defecto, el método agrega los valores al final de la matriz.

Tipo de dato: int?

sort

Un objeto SortDefinition que especifica cómo el controlador ordena los elementos de la matriz después de agregar los nuevos valores.

Tipo de dato: SortDefinition<TItem>

El siguiente ejemplo de código utiliza el método PushEach() para añadir dos nuevos objetos GradeEntry al inicio del arreglo Grades en todos los documentos coincidentes. Luego, se ordenan los elementos del arreglo en orden descendente según los valores de sus campos Score.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.Now, Grade = "A", Score = 95 },
new GradeEntry { Date = DateTime.Now, Grade = "B+", Score = 89,}
};
var scoreSort = Builders<GradeEntry>.Sort.Descending(g => g.Score);
var update = Builders<Restaurant>.Update.PushEach(
"Grades",
newGrades,
position: 0,
sort: scoreSort);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.Now, Grade = "A", Score = 95 },
new GradeEntry { Date = DateTime.Now, Grade = "B+", Score = 89,}
};
var scoreSort = Builders<GradeEntry>.Sort.Descending(g => g.Score);
var update = Builders<Restaurant>.Update.PushEach(
"Grades",
newGrades,
position: 0,
sort: scoreSort);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Para agregar varios valores a una matriz, pero solo si no existen en ella, llame al Builders.Update.AddToSetEach() método. Este método acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo de matriz al que se agregará uno o más valores.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

values

Los valores que se agregarán al campo de matriz.

Tipo de dato: IEnumerable<TItem>

El siguiente ejemplo de código llama al método AddToSetEach() para volver a agregar el primer y el segundo objeto GradeEntry a la matriz Grades en todos los documentos coincidentes. Dado que estos valores ya existen en la matriz, la operación de actualización no realiza ningún cambio.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var doc = _restaurantsCollection.Find(filter).FirstOrDefault();
var firstGradeEntries = new List<GradeEntry> { doc.Grades[0], doc.Grades[1] };
var update = Builders<Restaurant>.Update
.AddToSetEach(restaurant => restaurant.Grades, firstGradeEntries);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var doc = _restaurantsCollection.Find(filter).FirstOrDefault();
var firstGradeEntries = new List<GradeEntry> { doc.Grades[0], doc.Grades[1] };
var update = Builders<Restaurant>.Update
.AddToSetEach(restaurant => restaurant.Grades, firstGradeEntries);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Las siguientes secciones explican cómo eliminar valores de un campo de matriz.

Para eliminar el primer valor de una matriz, llame al método Builders.Update.PopFirst(). Este método acepta el siguiente parámetro:

Parameter
Descripción

field

Una expresión que especifica el campo de la matriz del cual se eliminará el primer valor.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

El siguiente ejemplo de código utiliza el método PopFirst() para remover el primer objeto GradeEntry del arreglo Grades en todos los documentos coincidentes:

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var update = Builders<Restaurant>.Update
.PopFirst(restaurant => restaurant.Grades);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var update = Builders<Restaurant>.Update
.PopFirst(restaurant => restaurant.Grades);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Para eliminar el último valor de una matriz, llame al método Builders.Update.PopLast(): Este método acepta el siguiente parámetro:

Parameter
Descripción

field

Una expresión que especifica el campo de la matriz del cual se eliminará el último valor.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

El siguiente ejemplo de código utiliza el método PopLast() para eliminar el último objeto GradeEntry de la matriz Grades en todos los documentos coincidentes:

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var update = Builders<Restaurant>.Update
.PopLast(restaurant => restaurant.Grades);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var update = Builders<Restaurant>.Update
.PopLast(restaurant => restaurant.Grades);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Para eliminar todas las instancias de un valor específico de una matriz, llame al método Builders.Update.Pull(). Este método acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo de la matriz del cual se eliminarán los valores.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

value

El valor que se eliminará del campo de la matriz.

Tipo de dato: TItem

El siguiente ejemplo de código utiliza el método Pull() para eliminar todas las instancias de un objeto GradeEntry específico de la matriz Grades en todos los documentos coincidentes:

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Add duplicate values to Grades array
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 },
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,}
};
var addUpdate = Builders<Restaurant>.Update
.PushEach("Grades", newGrades);
_restaurantsCollection.UpdateMany(filter, addUpdate);
// Remove duplicates from Grades array
var pullUpdate = Builders<Restaurant>.Update
.Pull(restaurant => restaurant.Grades, newGrades[0]);
var result = _restaurantsCollection.UpdateMany(filter, pullUpdate);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Add duplicate values to Grades array
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 },
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,}
};
var addUpdate = Builders<Restaurant>.Update
.PushEach("Grades", newGrades);
await _restaurantsCollection.UpdateManyAsync(filter, addUpdate);
// Remove duplicates from Grades array
var pullUpdate = Builders<Restaurant>.Update
.Pull(restaurant => restaurant.Grades, newGrades[0]);
var result = await _restaurantsCollection.UpdateManyAsync(filter, pullUpdate);
return result;

Para eliminar todas las instancias de más de un valor específico de una matriz, llame al método Builders.Update.PullAll(). Este método acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo de la matriz del cual se eliminarán los valores.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

values

Los valores a eliminar del campo de matriz.

Tipo de dato: IEnumerable<TItem>

El siguiente ejemplo de código utiliza el método PullAll() para eliminar todas las instancias de dos objetos GradeEntry específicos de la matriz Grades en todos los documentos coincidentes:

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Add duplicate values to Grades array
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 },
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,},
new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85 },
new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85,}
};
var addUpdate = Builders<Restaurant>.Update
.PushEach("Grades", newGrades);
_restaurantsCollection.UpdateMany(filter, addUpdate);
// Remove duplicates from Grades array
var gradesToRemove = new List<GradeEntry> { newGrades[0], newGrades[2] };
var pullUpdate = Builders<Restaurant>.Update
.PullAll(restaurant => restaurant.Grades, gradesToRemove);
var result = _restaurantsCollection.UpdateMany(filter, pullUpdate);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Add duplicate values to Grades array
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 },
new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,},
new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85 },
new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85,}
};
var addUpdate = Builders<Restaurant>.Update
.PushEach("Grades", newGrades);
await _restaurantsCollection.UpdateManyAsync(filter, addUpdate);
// Remove duplicates from Grades array
var gradesToRemove = new List<GradeEntry> { newGrades[0], newGrades[2] };
var pullUpdate = Builders<Restaurant>.Update
.PullAll(restaurant => restaurant.Grades, gradesToRemove);
var result = await _restaurantsCollection.UpdateManyAsync(filter, pullUpdate);
return result;

Para eliminar todos los valores que cumplen una condición específica de una matriz, llame al método Builders.Update.PullFilter(). Este método acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo de la matriz del cual se eliminarán los valores.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

filter

Un filtro de consulta que especifica la condición para eliminar los valores.

Tipo de dato: FilterDefinition<TItem>

El siguiente ejemplo de código utiliza el método PullFilter() para eliminar todos los objetos GradeEntry donde el valor Grade es "F" de la matriz Grades en los documentos coincidentes:

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Add GradeEntry values with "Grade = F" to Grades array
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 10 },
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 21,},
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 47 },
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 6,}
};
var addUpdate = Builders<Restaurant>.Update
.PushEach("Grades", newGrades);
_restaurantsCollection.UpdateMany(filter, addUpdate);
// Remove all "Grade = F" values from Grades array
var pullUpdate = Builders<Restaurant>.Update
.PullFilter(restaurant => restaurant.Grades, gradeEntry => gradeEntry.Grade == "F");
var result = _restaurantsCollection.UpdateMany(filter, pullUpdate);
return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Add GradeEntry values with "Grade = F" to Grades array
var newGrades = new List<GradeEntry>
{
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 10 },
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 21,},
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 47 },
new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 6,}
};
var addUpdate = Builders<Restaurant>.Update
.PushEach("Grades", newGrades);
await _restaurantsCollection.UpdateManyAsync(filter, addUpdate);
// Remove all "Grade = F" values from Grades array
var pullUpdate = Builders<Restaurant>.Update
.PullFilter(restaurant => restaurant.Grades, gradeEntry => gradeEntry.Grade == "F");
var result = await _restaurantsCollection.UpdateManyAsync(filter, pullUpdate);
return result;

Para actualizar un valor en un campo de arreglo, llama al método Builders.Update.Set(). Este método acepta los siguientes parámetros:

Parameter
Descripción

field

Una expresión que especifica el campo del arreglo a actualizar.

Tipo de dato: Expression<Func<TDocument, IEnumerable<TItem>>>

value

El nuevo valor que se va a establecer en el campo del arreglo.

Tipo de dato: TItem

Puede usar el operador posicional con el Set() método para consultar y actualizar valores específicos en la matriz. Si usa el3 proveedor LINQ, el controlador .NET/C# también admite la sintaxis LINQ en lugar del operador posicional.

Las siguientes secciones describen diferentes formas de actualizar valores coincidentes en un campo de matriz.

Para actualizar el primer valor de una matriz, puede usar el operador posicional ($) o la sintaxis LINQ. Seleccione un Positional Operator o la pestaña LINQ para ver la sintaxis correspondiente.

El siguiente ejemplo utiliza el Set() método y el operador posicional para actualizar la Grades matriz en todos los documentos coincidentes. Primero, encuentra solo el primer GradeEntry objeto de la Grades matriz donde la Grade propiedad tiene el "A" valor. Luego, actualiza la Score propiedad del primer GradeEntry objeto coincidente 100 a.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") &
Builders<Restaurant>.Filter.Eq("grades.grade", "A");
// Set Score = 100 in first GradeEntry where Grade = "A"
var update = Builders<Restaurant>.Update
.Set("grades.$.score", 100);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;

Nota

Para utilizar el operador posicional, el campo de matriz debe ser parte del filtro de consulta.

El siguiente ejemplo utiliza el Set() método y el operador posicional para actualizar la Grades matriz en todos los documentos coincidentes. Primero, encuentra solo el primer GradeEntry objeto de la Grades matriz donde la Grade propiedad tiene el "A" valor. Luego, actualiza la Score propiedad del primer GradeEntry objeto coincidente 100 a.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") &
Builders<Restaurant>.Filter.Eq("grades.grade", "A");
// Set Score = 100 in first GradeEntry where Grade = "A"
var update = Builders<Restaurant>.Update
.Set("grades.$.score", 100);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Nota

Para utilizar el operador posicional, el campo de matriz debe ser parte del filtro de consulta.

El siguiente ejemplo utiliza los Set() FirstMatchingElement() métodos y para actualizar la Grades matriz en todos los documentos coincidentes. Primero, busca solo el primer GradeEntry objeto de la Grades matriz donde la Grade propiedad tenga el "A" valor. Luego, actualiza la Score propiedad del primer GradeEntry objeto coincidente 100 a.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") &
Builders<Restaurant>.Filter.Eq("grades.grade", "A");
// Set Score = 100 in first GradeEntry where Grade = "A"
var update = Builders<Restaurant>.Update
.Set(restaurant => restaurant.Grades.FirstMatchingElement().Score, 100);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;

El siguiente ejemplo utiliza los Set() FirstMatchingElement() métodos y para actualizar la Grades matriz en todos los documentos coincidentes. Primero, busca solo el primer GradeEntry objeto de la Grades matriz donde la Grade propiedad tenga el "A" valor. Luego, actualiza la Score propiedad del primer GradeEntry objeto coincidente 100 a.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") &
Builders<Restaurant>.Filter.Eq("grades.grade", "A");
// Set Score = 100 in first GradeEntry where Grade = "A"
var update = Builders<Restaurant>.Update
.Set(restaurant => restaurant.Grades.FirstMatchingElement().Score, 100);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Para actualizar todos los valores de una matriz que cumplan una condición específica, puede usar el operador posicional filtrado ($[<identifier>]) o la sintaxis LINQ. Seleccione una pestaña Positional Operator o LINQ para ver la sintaxis correspondiente.

El siguiente ejemplo utiliza el método Set() y el operador posicional filtrado para actualizar la propiedad Score de todos los objetos GradeEntry coincidentes en el arreglo Grades a 100 en todos los documentos que coincidan.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<Restaurant>(
new BsonDocument
{
{ "gradeEntry.score", new BsonDocument { { "$gte", 94} } }
})
};
// Set Grade = "A" in all GradeEntry objects where Score >= 94
var update = Builders<Restaurant>.Update
.Set("grades.$[gradeEntry].grade", "A");
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
var result = _restaurantsCollection.UpdateMany(filter, update, updateOptions);
return result;

El siguiente ejemplo utiliza el método Set() y el operador posicional filtrado para actualizar la propiedad Score de todos los objetos GradeEntry coincidentes en el arreglo Grades a 100 en todos los documentos que coincidan.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<Restaurant>(
new BsonDocument
{
{ "gradeEntry.score", new BsonDocument { { "$gte", 94} } }
})
};
// Set Grade = "A" in all GradeEntry objects where Score >= 94
var update = Builders<Restaurant>.Update
.Set("grades.$[gradeEntry].grade", "A");
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
var result = await _restaurantsCollection.UpdateManyAsync(filter, update, updateOptions);
return result;

El siguiente ejemplo utiliza los métodos Set() y AllMatchingElements() para actualizar la propiedad Score de todos los objetos GradeEntry coincidentes en la matriz Grades a 100 en todos los documentos coincidentes.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<Restaurant>(
new BsonDocument
{
{ "gradeEntry.score", new BsonDocument { { "$gte", 94} } }
})
};
// Set Grade = "A" in all GradeEntry objects where Score >= 94
var update = Builders<Restaurant>.Update
.Set(restaurant => restaurant.Grades.AllMatchingElements("gradeEntry").Grade, "A");
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
var result = _restaurantsCollection.UpdateMany(filter, update, updateOptions);
return result;

El siguiente ejemplo utiliza los métodos Set() y AllMatchingElements() para actualizar la propiedad Score de todos los objetos GradeEntry coincidentes en la matriz Grades a 100 en todos los documentos coincidentes.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<Restaurant>(
new BsonDocument
{
{ "gradeEntry.score", new BsonDocument { { "$gte", 94} } }
})
};
// Set Grade = "A" in all GradeEntry objects where Score >= 94
var update = Builders<Restaurant>.Update
.Set(restaurant => restaurant.Grades.AllMatchingElements("gradeEntry").Grade, "A");
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
var result = await _restaurantsCollection.UpdateManyAsync(filter, update, updateOptions);
return result;

Para actualizar todos los valores de una matriz que coincidan con un filtro de consulta, puede usar el operador posicional ($[]) o la sintaxis LINQ. Seleccione una pestaña Positional Operator o LINQ para ver la sintaxis correspondiente.

El siguiente ejemplo utiliza el método Set() y el operador de todas las posiciones para actualizar la propiedad Score de todos los objetos GradeEntry en la matriz Grades a 100 en todos los documentos coincidentes.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Set Score = 100 in all GradeEntry objects
var update = Builders<Restaurant>.Update
.Set("grades.$[].score", 100);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;

El siguiente ejemplo utiliza el método Set() y el operador de todas las posiciones para actualizar la propiedad Score de todos los objetos GradeEntry en la matriz Grades a 100 en todos los documentos coincidentes.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Set Score = 100 in all GradeEntry objects
var update = Builders<Restaurant>.Update
.Set("grades.$[].score", 100);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

El siguiente ejemplo utiliza los métodos Set() y AllElements() para actualizar la propiedad Score de todos los objetos GradeEntry en la matriz Grades a 100 en todos los documentos coincidentes.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Set Score = 100 in all GradeEntry objects
var update = Builders<Restaurant>.Update
.Set(restaurant => restaurant.Grades.AllElements().Score, 100);
var result = _restaurantsCollection.UpdateMany(filter, update);
return result;

El siguiente ejemplo utiliza los métodos Set() y AllElements() para actualizar la propiedad Score de todos los objetos GradeEntry en la matriz Grades a 100 en todos los documentos coincidentes.

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli");
// Set Score = 100 in all GradeEntry objects
var update = Builders<Restaurant>.Update
.Set(restaurant => restaurant.Grades.AllElements().Score, 100);
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
return result;

Para obtener más información sobre cualquiera de los métodos o tipos analizados en esta guía, consulte la siguiente documentación de API:

Volver

Campos

En esta página