If I am doing an ElementMatch Filter like
Builders.Filter.ElemMatch(c => c.Entries, t => t.Id == fromId)
then I want to only update the matching elements
var horseSet = Builders.Update.Set(c => c.Entries.AllMatchingElements(“IDENTIFIER”).Name, to.DisplayName);
How do I supply the identifier to the Filter, or is it autogenerated?
I think I figured it out, but it is very ugly!
// Setup the element match, why can't I specify an identifier here?
var filter = Builders<Cart>.Filter.ElemMatch(c => c.Entries, t => t.Id == fromId);
// Do the $set
var set = Builders<Cart>.Update.Set(c => c.Entries.AllMatchingElements("h").Name, to.DisplayName);
// Setup the array filter using non-type safe BsonDocuments!
var arrayFilters = new[] {
new BsonDocumentArrayFilterDefinition<BsonDocument>(
new BsonDocument("h._id",
new BsonDocument("$eq", fromId)))
};
//Or, using json, I'm not sure which is worse
var arrayFilters = new JsonArrayFilterDefinition<Cart>($@"{{""h._id"": {{ $eq: ""{fromId}""}} }}" )
await Models.UpdateManyAsync(filter, set, new UpdateOptions
{
ArrayFilters = arrayFilters
});