如何解决MongoDB-使用.NET驱动程序和LINQ进行多次查找具有分组和过滤功能
给出以下示例MongoDB收集模型:
public class House
{
public int Id { get; set; }
public string Address { get; set; }
public double SquareFeet { get; set; }
public int NumberOfbedrooms { get; set; }
public int NumberOfKitchens { get; set; }
}
public class Mortgage
{
public int Id { get; set; }
public int HouseId {get; set; } // FK
public decimal Sum { get; set; }
public string CurrencyName { get; set; }
}
public class Mortgagee
{
public int Id { get; set; }
public int MortgageId { get; set; } // FK
public string InstitutionName { get; set; }
public string InstitutionAddress { get; set; }
}
public class Mortgagor
{
public int Id { get; set; }
public int MortgageId { get; set; } // FK
public string Name { get; set; }
public string Address { get; set; }
}
public class Owner
{
public int Id { get; set; }
public int HouseID { get; set; } // FK
public string FirstName { get; set; }
public string LastName { get; set; }
}
{
"House": {
"Id": 123,"Address": "Some city,1234,UnkNown St.","SquareFeet": "12345.67","NumberOfbedrooms": 4,"NumberOfKitchens": 2,},"Mortgages": [
{
"Id": 234,"HouseId": 123,"Sum": 1234.56,"CurrencyName": "USD","Mortgagee": {
"Id": 345,"MortgageId": 234,"InstitutionName": "Some institution","InstitutionAddress": "Some city,5678,UnkNown St."
},"Mortgagors": [
{
"Id": 456,"Name": "John Smith",UnkNown St."
},{
"Id": 567,"Name": "Ann Smith",UnkNown St."
}
]
}
],"Owners": [
{
"Id": 678,"FirstName": "John","LastName": "Smith"
},{
"Id": 789,"FirstName": "Ann","LastName": "Smith"
}
]
}
我知道可以使用Lookup function来执行联接操作,但是我可以找到的所有示例(在MongoDB文档中以及在SO,博客等上)都非常简单,并且不包含任何(聚合),因为实际模型更加复杂。
所以本质上我想做的是:
- 为房屋创建过滤器
- 匹配所有符合房屋过滤条件的房屋并将其分组
- 查找房屋的所有抵押贷款
- 过滤抵押贷款并将其分组
- 查找所有抵押的所有抵押
- 查找所有抵押人的所有抵押贷款
- 查找所有房主
- 过滤所有者并将其分组
- ...
我现在能做的是:
public class HouseResult: House
{
public IList<Mortgage> Mortgages { get; set; }
public IList<Owner> Owners { get; set; }
}
var housesWithMortgagesAndOwners = housesCollection
.Aggregate()
.Match(houseFilter)
.Lookup<House,Mortgage,HouseResult>(
mortgagesCollection,localField => localField.Id,foreignField => foreignField.HouseId,output => c.Mortgages)
.Lookup<HouseResult,Owner,HouseResult>(
ownersCollection,c => c.Owners)
.ToList();
但是,我不确定如何对嵌套数组进行Lookup()
处理(在上面的示例中-如何为每个抵押贷款查找所有抵押贷款/抵押贷款。我知道我可以Unwind()
数组,但是我之前建立的结构将不复存在,因为我将用抵押清单代替根。
另外-现在,我确定如何有效地将分组/过滤应用于Lookup()
。
感谢所有建议!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。