Tôi đã mất một thời gian để tìm ra điều này vì nó dường như không được đề cập trong bất kỳ tài liệu chính thức nào (hoặc bất kỳ nơi nào khác). Tuy nhiên, tôi đã tìm thấy điều này trên trình theo dõi vấn đề của họ, trình theo dõi sự cố giải thích cách sử dụng toán tử vị trí $
với trình điều khiển C # 2.0.
Điều này sẽ làm những gì bạn muốn:
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;
}
Lưu ý rằng Item.Single()
của bạn mệnh đề đã được thay đổi thành Item.Any()
và chuyển sang định nghĩa bộ lọc.
[-1]
hoặc .ElementAt(-1)
dường như được đối xử đặc biệt (thực sự là mọi thứ <0) và sẽ được thay thế bằng toán tử vị trí $
.
Ở trên sẽ được dịch sang truy vấn này:
db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } })