Search code examples
c#mongodbmongodb-.net-drivermongodb-query

Limit fields of embedded documents


I'm using the official MongoDB C# Driver to communicate with my MongoDB Servers. This is my complete entity scheme:

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; }
}

Now, in several cases i just want to get the following return:

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; }
}

The default behavior to load all fields and do the mapping by myself

MongoCursor<Person>

is senseless, because I just want to load the specific fields. With the help of reflection I generate the fields to load and send:

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

I thought the serializer of MongoDB would be intelligent; but the call returns following error:

System.IO.FileFormatException: Required element 'City' for property 'City' of class Models.Address_CityOnly is missing

Any ideas to this requirement?


Solution

  • I've updated the complete MongoDB infrastructure. Now the code works with all viewModels such as Person_LocationOview. With the full scheme classes, the code still crashes and I do not know why.

    Now, all my view classes are implementing an own interface (IPartialEntityView). In my reflection method to get the field names I'll check this inheritance and only then I will load "Addresses.FieldName(s)". If the property type is no default .NET type or does not inherit IPartialEntityView I will use the complete field "Adresses".

    That works great. Thanks for all.