微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MongoDB-使用.NET驱动程序和LINQ进行多次查找具有分组和过滤功能

如何解决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,博客等上)都非常简单,并且不包含任何(聚合),因为实际模型更加复杂。

所以本质上我想做的是:

  1. 为房屋创建过滤器
  2. 匹配所有符合房屋过滤条件的房屋并将其分组
  3. 查找房屋的所有抵押贷款
  4. 过滤抵押贷款并将其分组
  5. 查找所有抵押的所有抵押
  6. 查找所有抵押人的所有抵押贷款
  7. 查找所有房主
  8. 过滤所有者并将其分组
  9. ...

这应该在一个数据库调用中发生。

我现在能做的是:

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 举报,一经查实,本站将立刻删除。