Het kostte me een tijdje om dit uit te zoeken, omdat het in geen van de officiële documentatie (of ergens anders) lijkt te worden genoemd. Ik heb dit echter wel gevonden op hun issue tracker, waarin wordt uitgelegd hoe de positionele operator $
moet worden gebruikt met de C# 2.0-driver.
Dit zou moeten doen wat je wilt:
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;
}
Merk op dat uw Item.Single()
clausule is gewijzigd in Item.Any()
en verplaatst naar de filterdefinitie.
[-1]
of .ElementAt(-1)
wordt blijkbaar speciaal behandeld (eigenlijk alles <0) en zal worden vervangen door de positionele operator $
.
Het bovenstaande wordt vertaald naar deze zoekopdracht:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })