Ce dont vous avez besoin n'est pas possible en utilisant une seule mise à jour sans une certaine logique côté application. Notez que upsert en tant que fonctionnalité n'est pas pertinent pour ce problème spécifique, sauf si vous souhaitez créer automatiquement de nouveaux documents Widget s'il n'en existe aucun avec le nom fourni.
Le problème que vous rencontrez est qu'aucune fonctionnalité ne vous permet d'effectuer deux mises à jour différentes en fonction de l'existence d'un élément de tableau. Vos deux seules options sont :
- Recherchez l'élément, déterminez l'existence des propriétés pertinentes, compilez une mise à jour appropriée avec vos propriétés nouvelles ou modifiées et exécutez-la. Cela vient avec l'inconvénient important qu'il ne s'agit pas d'une méthode sécurisée de concurrence. En d'autres termes, si deux services Web tentent cela en même temps, l'un d'entre eux pourrait écraser les modifications de l'autre.
- Faire en sorte que les propriétés du widget soient des documents de premier niveau plutôt qu'incorporés. Vous permet d'utiliser des upserts pour faire ce que vous voulez. L'inconvénient évident est que ce n'est pas une très bonne option en termes de conception de schéma. Vous n'obtiendrez pas automatiquement toutes les propriétés si vous récupérez un widget, par exemple.