In Node.js possiamo aggiornare gli oggetti embedded contenuti in un array di un documento di MongoDB.

Un documento in MongoDB può a sua volta contenere uno o più array di documenti annidati (embedded). Per aggiornare una proprietà di uno di questi documenti annidati occorre innanzitutto selezionare il documento genitore e quindi accedere alla proprietà del sottodocumento utilizzando l'operatore $.

Dato il seguente documento della collezione products:


{
    id: 10,
    price: 50.20,
    attributes: [
       {
          name: 'foo',
          id: 2
       },
       {
          name: 'test',
          id: 3
       }
    ]
}

Volendo aggiornare il secondo documento embedded modificando la sua proprietà id con il valore 5, possiamo implementare la seguente soluzione:


products.findOneAndUpdate({id: 10, 'attributes.name': 'test'}, {$set: {'attributes.$.id': 5}}, (err, doc) => {
    //...
});

Il metodo findOneAndUpdate() accetta tre argomenti:

  1. Query per selezionare il documento.
  2. Query per aggiornare il documento.
  3. Funzione di callback che può restituire un errore o il documento aggiornato.

Il primo e il secondo argomento lavorano insieme con una sintassi speciale quando si tratta di array di documenti embedded. In particolare attributes.name permette di selezionare il documento che stiamo cercando nell'array. Una volta individuato il documento, la sintassi attributes.$.proprietà permette di accedere ad una proprietà specifica dell'oggetto selezionato e di aggiornarla.