Ограничить поля вложенных документов
Я использую официальный драйвер 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 будет интеллектуальным; но вызов возвращает следующую ошибку:
System.IO.FileFormatException: обязательный элемент 'City' для свойства 'City' класса Models.Address_CityOnly отсутствует
Есть идеи по этому требованию?
1 ответ
Я обновил полную инфраструктуру MongoDB. Теперь код работает со всеми моделями представления, такими как Person_LocationOview. С полной схемой классов код все еще падает, и я не знаю почему.
Теперь все мои классы представлений реализуют собственный интерфейс (IPartialEntityView). В моем методе отражения, чтобы получить имена полей, я проверю это наследование, и только тогда я буду загружать "Addresses.FieldName(s)". Если тип свойства не является типом.NET по умолчанию или не наследует IPartialEntityView, я буду использовать полное поле "Адреса".
Это прекрасно работает. Спасибо за все.