Intente usar el posicional $ operador
en la actualización que identifica un elemento en una matriz para actualizar sin especificar explícitamente la posición del elemento en la matriz, pero esto solo coincidirá con un elemento a la vez:
User.update(
{
"local.email": user,
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
},
{
"$set": {
"devices.$.id": deviceID,
"devices.$.name": deviceName
}
}
);
De los docs , el operador posicional $ actúa como marcador de posición para el primer elemento que coincide con el documento de consulta, y el campo de matriz debe aparecer como parte del documento de consulta, por lo tanto, el documento de consulta
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
contiene el device array y coincidirá con aquellos documentos donde el device matriz id no es igual a deviceID y el nombre no es el mismo que el nombre que está intentando actualizar. Esto incluso coincidirá con los documentos en los que el device la matriz está vacía.