Ciò di cui hai bisogno non è possibile utilizzando un singolo aggiornamento senza una logica lato app. Tieni presente che l'upsert come funzionalità non è rilevante per questo problema specifico a meno che tu non voglia creare automaticamente nuovi documenti Widget se non ne esistono con il nome fornito.
Il problema che stai riscontrando è che non esiste alcuna funzionalità che ti consenta di eseguire due diversi aggiornamenti a seconda dell'esistenza di un elemento dell'array. Le tue uniche due opzioni sono:
- Trova l'elemento, determina l'esistenza di proprietà rilevanti, compila un aggiornamento appropriato con le tue proprietà nuove o modificate ed eseguilo. Ciò comporta l'importante svantaggio che questo non è un metodo sicuro per la concorrenza. In altre parole, se due servizi Web tentano questo allo stesso, uno potrebbe sovrascrivere le modifiche l'uno dell'altro.
- Rendi le proprietà dei widget documenti di primo livello anziché incorporati. Ti permette di usare upsert per fare quello che vuoi. L'ovvio svantaggio è che non è un'opzione molto interessante in termini di progettazione dello schema. Non otterresti automaticamente tutte le proprietà se prelevi un widget, ad esempio.