限制嵌入文档的字段

本文关键字:字段 文档 | 更新日期: 2023-09-27 18:11:10

我使用官方MongoDB c#驱动程序与我的MongoDB服务器进行通信。这是我完整的实体方案:

public class Person
{
    public ObjectId _id { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public List<Address> Addresses  { get; set; }
}
public class Address
{
    public String Street { get; set; }
    public String City { get; set; }
}

现在,在一些情况下,我只想得到以下返回:

public class Person_LocationOview
{
    public String LastName { get; set; }
    public List<Address_CityOnly> Addresses  { get; set; }
}
public class Address_CityOnly
{
    public String City { get; set; }
}

默认加载所有字段并自行完成映射

MongoCursor<Person>

没有意义,因为我只想加载特定的字段。在反射的帮助下,我生成要加载和发送的字段:

var fields = new { "LastName", "Addresses.City" };
MongoCollection< BsonDocument >.FindAllAs< Person_LocationOview >( )
     .SetFields( fields ).ToList( );

我认为MongoDB的序列化器是智能的;但是调用返回以下错误:

先。类Models的属性City需要元素City。Address_CityOnly缺失

对这个要求有什么想法吗?

限制嵌入文档的字段

我已经更新了完整的MongoDB基础设施。现在代码可以与所有viewmodel一起工作,比如Person_LocationOview。使用完整的方案类,代码仍然崩溃,我不知道为什么。

现在,我所有的视图类都实现了自己的接口(IPartialEntityView)。在我的反射方法中获得字段名,我会检查这个继承,只有这样我才会加载"Addresses.FieldName(s)"。如果属性类型不是默认的。net类型或没有继承IPartialEntityView,我将使用完整字段"addresses"。

效果很好。