Mi ci è voluto un po' per capirlo perché non sembra essere menzionato in nessuna documentazione ufficiale (o altrove). Tuttavia, l'ho trovato sul loro tracker dei problemi, che spiega come utilizzare l'operatore posizionale $
con il driver C# 2.0.
Questo dovrebbe fare quello che vuoi:
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;
}
Nota che il tuo Item.Single()
la clausola è stata modificata in Item.Any()
e spostato alla definizione del filtro.
[-1]
o .ElementAt(-1)
è apparentemente trattato in modo speciale (in realtà tutto <0) e verrà sostituito con l'operatore posizionale $
.
Quanto sopra verrà tradotto in questa query:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })