Det du behöver är inte möjligt med en enda uppdatering utan någon logik på appsidan. Observera att upsert som en funktion inte är relevant för detta specifika problem om du inte automatiskt vill skapa nya widgetdokument om det inte finns några med det angivna namnet.
Problemet du stöter på är att det inte finns någon funktion som låter dig göra två olika uppdateringar beroende på att det finns ett array-element. Dina enda två alternativ är:
- Hitta objektet, bestäm förekomsten av relevanta egenskaper, kompilera en lämplig uppdatering med dina nya eller ändrade egenskaper och kör den. Detta kommer med den viktiga nackdelen att detta inte är en samtidighetssäker metod. Med andra ord, om två webbtjänster försöker detta samtidigt kan man skriva över varandras ändringar.
- Gör widgetegenskaper till dokument på toppnivå i stället för inbäddade. Låter dig använda upserts för att göra vad du vill. Uppenbar nackdel är att det inte är ett särskilt trevligt alternativ när det gäller schemadesign. Du skulle inte automatiskt få alla egenskaper om du till exempel hämtar en widget.