I have a document that can have a "Favorites" element on it and I'm trying to push a new value into an array on that element. However, I'm getting an error because the document I'm trying to update doesn't have the "Favorites" element. How can I create the element if it doesn't exist so I can push the new value into it's array property? Can I do it in one operation? Here's what I'm doing, but I get the error cannot use the part (Favorites of Favorites.ProgramIds) to traverse the element ({Favorites: null})
var filter = Builders<UserEntity>.Filter.Eq(u => u.Id, userId);
var update = isFavorite ? Builders<UserEntity>.Update.AddToSet(u => u.Favorites.ProgramIds, id)
: Builders<UserEntity>.Update.Pull(u => u.Favorites.ProgramIds, id);
await collection.UpdateOneAsync(filter, update);
If want duplicates to be ignored, you can use $addToSet, which will create or append into the array, treating it as a set. If you just want it to be a normal-ass normal array, then use $push. If you're explicitly using $push and getting errors, you shouldn't, and that's a separate problem; see the official docs: "If the field is absent in the document to update, $push adds the array field with the value as its element."