У меня есть новый запрос для коллекции, которая уже извлекает и хранит данные для сконфигурированного типа, и я раньше не сталкивался с этим:
The serializer for field 'BookingRequests' must implement IBsonArraySerializer and provide item serialization info.
У меня есть объект, имеющий следующую структуру:
public class DayBookings : IHasId
{
public DayBookings()
{
BookingRequests = new Dictionary<string, TimestampedRequest<BookingRequest>>();
}
public DayBookings(TimestampedRequest<BookingRequest> bookingRequest, string restaurant) : this()
{
Id = $"{restaurant}_{bookingRequest.Request.Date.ToString("ddMMyyyy")}";
Restaurant = restaurant;
Date = bookingRequest.Request.Date;
BookingRequests[bookingRequest.RequestId] = bookingRequest;
}
public string Id { get; set; }
public string Restaurant { get; set; }
public DateTime Date { get; set; }
public Dictionary<string, TimestampedRequest<BookingRequest>> BookingRequests { get; set; }
}
, где TimestampedRequest
- это стандартный объект POCO с общими данными внутри.
Конфигурация для этой коллекции, которую я запускаю при запуске:
if (!BsonClassMap.IsClassMapRegistered(typeof(DayBookings)))
{
BsonClassMap.RegisterClassMap<DayBookings>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.Id));
var customDictionarySerializer = new DictionaryInterfaceImplementerSerializer<Dictionary<string, TimestampedRequest<BookingRequest>>>(dictionaryRepresentation: DictionaryRepresentation.Document,
keySerializer: new StringSerializer(BsonType.String),
valueSerializer: BsonSerializer.SerializerRegistry.GetSerializer<TimestampedRequest<BookingRequest>>());
cm.GetMemberMap(c => c.BookingRequests)
.SetSerializer(customDictionarySerializer);
});
}
Я добавил пользовательский сериализатор для этого поля на тот случай, если он мне понадобился, но он не дал никакого эффекта.
Я пытаюсь выполнить запрос:
public async Task<IEnumerable<DateTime>> GetAllDatesWithUnconfirmedBookings(string restaurant)
{
IEnumerable<DateTime> dates = null;
try
{
dates = await Collection.Find(Builders<DayBookings>.Filter.And(
Builders<DayBookings>.Filter.Eq(d => d.Restaurant, restaurant),
Builders<DayBookings>.Filter.Gte(d => d.Date, DateTime.UtcNow.Date),
Builders<DayBookings>.Filter.ElemMatch(d => d.BookingRequests, b => b.Value.Request.Status == Domain.Requests.BookingStatus.Unconfirmed)))
.SortBy(d => d.Date)
.Project(d => d.Date)
.ToListAsync();
}
catch (Exception ex)
{
Logger.Error(ex, $"Error getting all dates with pending bookings for Restaurant={restaurant}");
}
return dates;
}
Я не смог найти много информации о конфигурации, которую мне пришлось бы установить для поля BookingRequests
, поэтому я был бы признателен за помощь здесь.
Большое спасибо!