Det tog ett tag för mig att ta reda på detta eftersom det inte verkar nämnas i någon av den officiella dokumentationen (eller någon annanstans). Jag hittade dock detta på deras problemspårare, som förklarar hur man använder positionsoperatorn $
med C# 2.0-drivrutinen.
Detta bör göra vad du vill:
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;
}
Lägg märke till att din Item.Single()
klausulen har ändrats till Item.Any()
och flyttade till filterdefinitionen.
[-1]
eller .ElementAt(-1)
behandlas tydligen speciellt (egentligen allt <0) och kommer att ersättas med positionsoperatorn $
.
Ovanstående kommer att översättas till denna fråga:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })