Butuh beberapa saat untuk mengetahui hal ini karena tampaknya tidak disebutkan dalam dokumentasi resmi mana pun (atau di mana pun). Namun saya menemukan ini di pelacak masalah mereka, yang menjelaskan cara menggunakan operator posisi $
dengan driver C# 2.0.
Ini harus melakukan apa yang Anda inginkan:
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;
}
Perhatikan bahwa Item.Single()
. Anda klausa telah diubah menjadi Item.Any()
dan pindah ke definisi filter.
[-1]
atau .ElementAt(-1)
tampaknya diperlakukan secara khusus (sebenarnya semuanya <0) dan akan diganti dengan operator posisi $
.
Di atas akan diterjemahkan ke kueri ini:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })