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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...