Así que probé de varias formas, pero no puedo, puedo modificar varios objetos con la misma clave pero no puedo modificar ninguno con diferentes claves, si alguien me puede ayudar es un problema bastante complejo
{ id: 123, "infos": [ { name: 'Joe', value: 'Disabled', id: 0 }, { name: 'Adam', value: 'Enabled', id: 0 } ] };En mi base de datos tengo una colección con una matriz y varios objetos dentro que dan esto.
Quiero modificar estos objetos, filtrar por su nombre y modificar el valor.
Para darle un mejor ejemplo, mi sitio me devuelve un objeto con los nuevos datos, y quiero modificar el objeto de la base de datos con el nuevo objeto, sin borrar la matriz, la clave del nombre nunca cambia.
const object = [ { name: 'Joe', value: 'Hey', id: 1 }, { name: 'Adam', value: 'None', id: 1 } ]; for(const obj in object) { Schema.findOneAndUpdate({ id: 123 }, { $set: { [`infos.${obj}.value`]: "Test" } }) }Este código funciona pero no está optimizado, hace varias solicitudes, me gustaría hacer todo en una sola solicitud, y además no actualiza la identificación, solo el valor.
Si alguien me puede ayudar sería genial, he buscado por todos lados y no encuentro nada
Mi estructura de esquema
new Schema({ id: { "type": String, "required": true, "unique": true }, infos: [] }) Uso el método $addToSet para insertar objetos en la matriz de infos .
Prueba esto :
db.collection.update({ id: 123, }, { $set: { "infos.$[x].value": "Value", "infos.$[x].name": "User" } }, { arrayFilters: [ { "x.id": { $in: [ 1 ] } }, ], multi: true }) El operador $[] todo posicional actúa como un marcador de posición para todos los elementos en el campo de matriz.
En $in puede usar una array dinámica de id. Ex :
identificadores constantes = [1,2,..n]
db.collection.update( //Same code as it is... { arrayFilters: [ { "x.id": { $in: ids } }, ], multi: true })
Enlace de MongoPlayGround: https://mongoplayground.net/p/Tuz831lkPqk
Tal vez busques algo como esto:
db.collection.update({}, { $set: { "infos.$[x].value": "test1", "infos.$[x].id": 10, "infos.$[y].value": "test2", "infos.$[y].id": 20 } }, { arrayFilters: [ { "x.name": "Adam" }, { "y.name": "Joe" } ], multi: true })Explicado:
Usted define arrayFilters para todos los nombres en los objetos que tiene y actualiza los valores y la identificación en todos los documentos...