Usa il metodo della shell findAndModify
per soddisfare le tue esigenze.
Ma non puoi usare il carattere posizionale $
più di una volta durante la proiezione in MongoDb, quindi potrebbe essere necessario tenerne traccia da soli sul lato client.
Usa arrayFilters
per aggiornare il documento secondario profondamente nidificato, invece dell'operatore posizionale all $[]
.
Di seguito è una query funzionante -
var query = {
universe: 'comics'
};
var update = {
$set: {
'saga.$[outer].characters.$[inner].character': 'lobezno',
'saga.$[outer].characters.$[inner].picture': '618035022354.png',
}
};
var fields = {
'saga.characters': 1
};
var updateFilter = {
arrayFilters: [
{
'outer.name': 'x-men'
},
{
'inner.character': 'wolverine'
}
]
};
db.collection.findAndModify({
query,
update,
fields,
arrayFilters: updateFilter.arrayFilters
new: true
});