Ich habe eine Weile gebraucht, um das herauszufinden, da es anscheinend in keiner der offiziellen Dokumentationen (oder anderswo) erwähnt wird. Ich habe dies jedoch in ihrem Issue-Tracker gefunden, der erklärt, wie der Positionsoperator $
verwendet wird mit dem C# 2.0-Treiber.
Dies sollte tun, was Sie wollen:
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;
}
Beachten Sie, dass Ihre Item.Single()
-Klausel wurde in Item.Any()
geändert und in die Filterdefinition verschoben.
[-1]
oder .ElementAt(-1)
wird anscheinend besonders behandelt (eigentlich alles <0) und durch den Positionsoperator $
ersetzt .
Das Obige wird in diese Abfrage übersetzt:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })