Il problema qui è il tuo malinteso su una copula.
Quando esegui "outerArray.field.innerArray": { $in: [ 1, 3 ] }
nella tua query, non stai ricevendo solo innerArray
dove ha 1 o 3. Stai ottenendo documenti dove esistono questi array.
Quindi stai interrogando l'intero documento.
Devi usare arrayFilter
per aggiornare i valori quando il filtro corrisponde.
Quindi, se ho capito bene, la query che desideri è:
db.collection.update(
{}, //Empty object to find all documents
{
$push: { "outerArray.$[elem].field.innerArray": 4 }
},
{
"arrayFilters": [ { "elem.field.innerArray": { $in: [ 1, 3 ] } } ]
})
Esempio qui
Nota come il primo oggetto in update
è vuoto. Devi mettere lì il campo per abbinare il documento (non l'array, il documento).
Se vuoi aggiornare un solo documento devi riempire il primo oggetto (oggetto query) con i valori che vuoi, ad esempio:{"_id": 11}
.