Отне ми известно време, за да разбера това, тъй като изглежда не е споменато в нито една от официалната документация (или някъде другаде). Намерих обаче това в техния инструмент за проследяване на проблеми, който обяснява как да използвате позиционния оператор $
с драйвера C# 2.0.
Това трябва да прави това, което искате:
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;
}
Забележете, че вашият Item.Single()
Клаузата е променена на Item.Any()
и се премести към дефиницията на филтъра.
[-1]
или .ElementAt(-1)
очевидно се третира специално (всъщност всичко <0) и ще бъде заменено с позиционния оператор $
.
Горното ще бъде преведено на тази заявка:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })