LINQ
означает встроенный в язык запрос, когда вы пытаетесь обновить документ, поэтому на самом деле вам нужен метод UpdateOne
. Поскольку у вас есть более одного вложенного массива, вы можете использовать обычный запрос для идентификации Contract
вместе с позиционным оператором $ , чтобы указать, какой Payment
(вложенный объект) следует изменить.
. NET Драйвер MongoDB предлагает специальный синтаксис, в котором вы можете передать -1
в качестве индекса, чтобы указать, что этот элемент будет идентифицирован на основе условия фильтрации. Попробуйте:
var filterBuilder = Builders<Contract>.Filter;
var filter = filterBuilder.Eq(x => x.Id, contractId) &
filterBuilder.ElemMatch(doc => doc.Payments, el => el.Id == paymentId);
var updateBuilder = Builders<Contract>.Update;
var update = updateBuilder.Push(doc => doc.Payments[-1].PaymentTransactions, new PaymentTransaction());
col.UpdateOne(filter, update);