Chvíli mi trvalo, než jsem na to přišel, protože se nezdá, že by to bylo zmíněno v žádné oficiální dokumentaci (ani nikde jinde). Našel jsem to však na jejich nástroji pro sledování problémů, který vysvětluje, jak používat poziční operátor $
s ovladačem C# 2.0.
To by mělo dělat, co chcete:
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;
}
Všimněte si, že vaše Item.Single()
klauzule byla změněna na Item.Any()
a přesunuli se do definice filtru.
[-1]
nebo .ElementAt(-1)
je zjevně zpracováno speciálně (ve skutečnosti vše <0) a bude nahrazeno pozičním operátorem $
.
Výše uvedené bude převedeno na tento dotaz:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })