Overview
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.
Datos de muestra
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; } [] 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; } [] public double[] Coordinates { get; set; } public string Street { get; set; } [] 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 proviene de los conjuntos de datos de muestra proporcionados por Atlas. Consulte la Guía de inicio rápido para aprender a crear un clúster gratuito de MongoDB y cargar estos datos de muestra.
Añadir un valor
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 |
|---|---|
| Una expresión que especifica el campo de la matriz al que se agregará un valor. Tipo de dato: |
| El valor que se agregará al final del campo de la matriz. Tipo de dato: |
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 |
|---|---|
| Una expresión que especifica el campo de la matriz al que se agregará un valor. Tipo de dato: |
| El valor que se agregará al final del campo de la matriz. Tipo de dato: |
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;
Agregar múltiples valores
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 |
|---|---|
| Una expresión que especifica el campo de matriz al que se agregará uno o más valores. Tipo de dato: |
| Los valores que se agregarán al campo de matriz. Tipo de dato: |
| 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: |
| 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: |
| Un objeto 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 |
|---|---|
| Una expresión que especifica el campo de matriz al que se agregará uno o más valores. Tipo de dato: |
| Los valores que se agregarán al campo de matriz. Tipo de dato: |
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;
Remove Values
Las siguientes secciones explican cómo eliminar valores de un campo de matriz.
Primer valor
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 |
|---|---|
| Una expresión que especifica el campo de la matriz del cual se eliminará el primer valor. Tipo de dato: |
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;
Último valor
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 |
|---|---|
| Una expresión que especifica el campo de la matriz del cual se eliminará el último valor. Tipo de dato: |
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;
Todas las instancias de un valor
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 |
|---|---|
| Una expresión que especifica el campo de la matriz del cual se eliminarán los valores. Tipo de dato: |
| El valor que se eliminará del campo de la matriz. Tipo de dato: |
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;
Todas las instancias de valores múltiples
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 |
|---|---|
| Una expresión que especifica el campo de la matriz del cual se eliminarán los valores. Tipo de dato: |
| Los valores a eliminar del campo de matriz. Tipo de dato: |
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;
Todos los valores que coinciden con una condición
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 |
|---|---|
| Una expresión que especifica el campo de la matriz del cual se eliminarán los valores. Tipo de dato: |
| 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;
Actualizar valores coincidentes
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 |
|---|---|
| Una expresión que especifica el campo del arreglo a actualizar. Tipo de dato: |
| El nuevo valor que se va a establecer en el campo del arreglo. Tipo de dato: |
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.
Primer valor coincidente
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;
Todos los valores coincidentes
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;
All Values
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;
Documentación de la API
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: