Как найти и найти элемент Pu sh в массиве внутри другого массива в документе, используя LINQ to MongoDb - PullRequest
1 голос
/ 25 марта 2020

Я хочу добавить sh элемент в массив внутри другого массива внутри документа, используя LINQ с последним драйвером MongoDb

, вот код:

public class Contract : BaseDocument
{
    public ObjectId Id {get;set;}
    ...
    public List<Payment> Payments {get;set;}
}

public class Payment : BaseDocument
{
    public ObjectId Id {get;set;}
    public double TotalPaymentAmount {get;set;}
    public DateTime PaymentWorthDate {get;set;}
    ...
    public List<PaymentTransaction> PaymentTransactions {get;set;}
}

public class PaymentTransaction 
{
    public double AmountPaid {get;set;}
    public DateTime TransactionDateTime {get;set;}
}

Так как pu sh new PaymentTransaction с указанием c Payment в конкретном Contract с использованием 'выражения LINQ'?

Спасибо!

1 Ответ

1 голос
/ 25 марта 2020

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);
...