Problema aqui é o seu mal-entendido algumas coisas.
Quando você faz
"outerArray.field.innerArray": { $in: [ 1, 3 ] }
em sua consulta, você não está recebendo apenas innerArray
onde tem 1 ou 3. Você está obtendo documentos onde existem esses arrays. Então você está consultando todo o documento.
Você precisa usar
arrayFilter
para atualizar os valores quando o filtro corresponder. Então, se eu entendi corretamente, a consulta que você deseja é:
db.collection.update(
{}, //Empty object to find all documents
{
$push: { "outerArray.$[elem].field.innerArray": 4 }
},
{
"arrayFilters": [ { "elem.field.innerArray": { $in: [ 1, 3 ] } } ]
})
Exemplo aqui
Observe como o primeiro objeto em
update
está vazia. Você tem que colocar lá o campo para corresponder ao documento (não o array, o documento). Se você deseja atualizar apenas um documento, você deve preencher o primeiro objeto (objeto de consulta) com os valores desejados, por exemplo:
{"_id": 11}
.