Zajęło mi trochę czasu, aby to rozgryźć, ponieważ nie wydaje się, aby wspomniano o tym w żadnej oficjalnej dokumentacji (ani nigdzie indziej). Znalazłem to jednak w ich trackerze problemów, który wyjaśnia, jak używać operatora pozycyjnego $
ze sterownikiem C# 2.0.
To powinno zrobić to, co chcesz:
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;
}
Zauważ, że Twój Item.Single()
klauzula została zmieniona na Item.Any()
i przeniesiony do definicji filtra.
[-1]
lub .ElementAt(-1)
jest najwyraźniej traktowany specjalnie (właściwie wszystko <0) i zostanie zastąpiony operatorem pozycyjnym $
.
Powyższe zostanie przetłumaczone na to zapytanie:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })