Det tog mig et stykke tid at finde ud af dette, da det ikke ser ud til at være nævnt i nogen af den officielle dokumentation (eller andre steder). Jeg fandt dog dette på deres problemsporing, som forklarer, hvordan man bruger positionsoperatoren $
med C# 2.0-driveren.
Dette skulle gøre, hvad du vil:
public void UpdateItemTitle(string agendaId, string itemId, string title){
var filter = Builders<TempAgenda>.Filter.Where(x => x.AgendaId == agendaId && x.Items.Any(i => i.Id == itemId));
var update = Builders<TempAgenda>.Update.Set(x => x.Items[-1].Title, title);
var result = _collection.UpdateOneAsync(filter, update).Result;
}
Bemærk, at din Item.Single()
klausulen er blevet ændret til Item.Any()
og flyttede til filterdefinitionen.
[-1]
eller .ElementAt(-1)
behandles tilsyneladende specielt (faktisk alt <0) og vil blive erstattet med positionsoperatoren $
.
Ovenstående vil blive oversat til denne forespørgsel:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })