如何使用 LINQ to MongoDb 将文档中另一个数组中的数组中的元素 'Find And Push'
How to 'Find And Push' element in an array inside of another array in a document using LINQ to MongoDb
我想使用带有最新 MongoDb 驱动程序的 LINQ 将一个元素推送到文档中另一个数组中的数组中
代码如下:
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;}
}
那么如何使用 'LINQ Expression' 将新 PaymentTransaction
推送到特定 Contract
中的特定 Payment
?
谢谢!
当您尝试更新文档时,LINQ
代表语言集成查询,因此实际上您需要 UpdateOne
方法。由于您有多个嵌套数组,您可以利用常规查询来识别 Contract
以及 $ positional operator 以指示应修改哪个 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);
我想使用带有最新 MongoDb 驱动程序的 LINQ 将一个元素推送到文档中另一个数组中的数组中
代码如下:
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;}
}
那么如何使用 'LINQ Expression' 将新 PaymentTransaction
推送到特定 Contract
中的特定 Payment
?
谢谢!
LINQ
代表语言集成查询,因此实际上您需要 UpdateOne
方法。由于您有多个嵌套数组,您可以利用常规查询来识别 Contract
以及 $ positional operator 以指示应修改哪个 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);