Puede utilizar operadores posicionales con el lenguaje de consulta MongoDB (MQL) para actualizar documentos que contienen matrices sin reemplazar la matriz ni agregarle nada.
Este tutorial presenta varios casos de uso para operadores posicionales dentro de MongoDB.
Antes de comenzar
Instalar mangosta.
Conectarse a una implementación.
Usar
mongoshpara insertar documentos en una nueva colección en la base de datos predeterminadatest:db.employees.insertMany( [ { _id: 'SF', engineering: [ { name: 'Alice', email: 'missingEmail', salary: 100000 }, { name: 'Bob', email: 'missingEmail', salary: 75000 } ], sales: [ { name: 'Charlie', email: 'charlie@mail.com', salary: 90000, bonus: 1000 } ] }, { _id: 'NYC', engineering: [ { name: 'Dave', email: 'dave@mail.com', salary: 55000 }, ], sales: [ { name: 'Ed', email: 'ed@mail.com', salary: 99000, bonus: 2000 }, { name: 'Fran', email: 'fran@mail.com', salary: 50000, bonus: 10000 } ] } ] );
Pasos
Los siguientes ejemplos le muestran cómo:
Utilice el operador $ para actualizar la primera coincidencia en una matriz
Utilice el operador $ con $elemMatch para actualizar un elemento específico
Utilice el operador $[] para actualizar todos los elementos de una matriz dentro de un documento
Utilice el operador $ para actualizar la primera coincidencia en una matriz
Para actualizar solo la primera coincidencia dentro de una matriz, utilice el $ operador. El operador actúa como marcador de posición para actualizar el primer elemento $ coincidente.
El siguiente ejemplo utiliza el updateOne() método con los $ operadores y para actualizar el primer correo electrónico que tiene el valor $set missingEmail en la engineering matriz alice@mail.com a.
1 db.employees.updateOne( 2 { "engineering.email": "missingEmail" }, 3 { "$set": { "engineering.$.email": "alice@mail.com" } } 4 );
Utilice el método para confirmar la actualización del correo electrónico de find() Alice.
db.employees.find()
[ { _id: 'SF', engineering: [ { name: 'Alice', email: 'alice@mail.com', salary: 100000 }, { name: 'Bob', email: 'missingEmail', salary: 75000 } ], sales: [ { name: 'Charlie', email: 'charlie@mail.com', salary: 90000, bonus: 1000 } ] }, { _id: 'NYC', engineering: [ { name: 'Dave', email: 'dave@mail.com', salary: 55000 } ], sales: [ { name: 'Ed', email: 'ed@mail.com', salary: 99000, bonus: 2000 }, { name: 'Fran', email: 'fran@mail.com', salary: 50000, bonus: 10000 } ] } ]
Como se muestra en el ejemplo anterior, después de filtrar los documentos que tienen un elemento de matriz con el engineering.email campo establecido missingEmail en, el $ operador solo actualiza la primera ocurrencia que coincide con el filtro.
Utilice el operador $ con $elemMatch para actualizar un elemento específico
Para actualizar un elemento particular, puede utilizar el $elemMatch operador.
El siguiente ejemplo utiliza el operador$elemMatchy el operador$para actualizar email de Bob a "bob@mail.com".
1 db.employees.updateOne( 2 { engineering: { $elemMatch: { name: "Bob", email: "missingEmail" } } }, 3 { $set: { "engineering.$.email": "bob@mail.com" } } 4 );
Utilice el método para confirmar la actualización del correo electrónico de find() Bob.
db.employees.find( { "engineering": { $elemMatch: { name: "Bob" } } }, { "engineering.$": 1, _id: 0 } );
[ { engineering: [ { name: 'Bob', email: 'bob@mail.com', salary: 75000 } ] } ]
Utilice el operador $[] para actualizar todos los elementos de una matriz dentro de un documento
Para actualizar cada elemento de una matriz con una sola operación, utilice el $[] operador.
Considere un caso en el que desea otorgar una bonificación adicional de $2,000 a sus empleados de ventas en Nueva York. Puede usar el métodoupdateMany()con los operadores$[]y$incpara aumentar todos los campos bonus de la matriz sales del documento NYC en 2000.
1 db.employees.updateMany( 2 { "_id": "NYC" }, 3 { "$inc": { "sales.$[].bonus": 2000 } } 4 );
Utilice el método para confirmar la actualización de find() los bonus campos para los empleados del equipo de ventas de NYC.
db.employees.find( { _id: "NYC" }, { sales: 1, _id: 0 } );
[ { sales: [ { name: 'Ed', email: 'ed@mail.com', salary: 99000, bonus: 4000 }, { name: 'Fran', email: 'fran@mail.com', salary: 50000, bonus: 12000 } ] } ]
Utilice el operador $[<identifier>] para actualizar elementos que coinciden con una condición de filtro
Para actualizar varios elementos de una matriz en una sola operación sin necesidad de código excesivo del lado del cliente junto con una operación de reemplazo, utilice el $[<identifier>] operador. El operador actúa como marcador de posición $[<identifier>] para actualizar todos los elementos que cumplen una condición arrayFilters.
Considere un caso en el que desea actualizar los salarios de empleados específicos si cumplen ciertas condiciones. Puede usar el método updateMany() $[<identifier>] con el operador para realizar esta tarea.
1 db.employees.updateMany( 2 {}, 3 { 4 "$set": { 5 "engineering.$[elemX].salary": 95000, 6 "sales.$[elemY].salary": 75000 7 } 8 }, 9 { 10 "arrayFilters": [ 11 { "elemX.name": "Bob", "elemX.salary": 75000 }, 12 { "elemY.name": "Ed", "elemY.salary": 50000, } 13 ] 14 } 15 );
En el ejemplo anterior, el primer parámetro es una coincidencia vacía, para evaluar todos los documentos de la colección.
elemX y elemY representan dos arrayFilters diferentes:
Para que coincida con
elemX, un objeto de matriz debe tener un camponamedeBoby unsalaryde75000.Para que coincida con
elemY, un objeto de matriz debe tener un camponamedeEdy unsalaryde50000.
Si un elemento de la matriz del documento coincide con el elemX filtro,updateMany() establece el salary campo del objeto 95000 en. Si un elemento de la elemY matriz coincide con el filtro,updateMany() establece el salary campo del objeto 75000 en. Si un filtro no coincide, la $set operación correspondiente no se activa.
Utilice el método para confirmar la actualización del salario de Bob porque cumple con find() ambas elemX condiciones de.
db.employees.find( { "engineering.name": "Bob" }, { engineering: { $elemMatch: { name: "Bob" } }, _id: 0 } );
[ { engineering: [ { name: "Bob", email: "bob@mail.com", salary: 95000 } ] } ]
Utiliza el método find() para confirmar que la actualización del salario de Ed no tuvo éxito porque no cumple con ninguna de las condiciones de elemX ni de elemY.
db.employees.find( { "sales.name": "Ed" }, { sales: { $elemMatch: { name: "Ed" } }, _id: 0 } );
[ { sales: [ { name: "Ed", email: "ed@mail.com", salary: 99000, bonus: 4000 } ] } ]
Conclusión
Este tutorial le enseña algunos de los operadores posicionales del lenguaje de consulta MongoDB (MQL). Estos operadores son útiles al trabajar con matrices, ya que evitan tener que realizar reemplazos completos en la matriz o manipulaciones extensas del lado del cliente. Para obtener más información sobre MQL, consulte Introducción a Atlas.
Para obtener más información sobre los operadores de actualización en MongoDB, consulte Operadores de actualización.