У меня есть коллекция документов MongoDb, каждый из которых содержит массив встроенных документов.Я хотел бы получить сводный список тех вложенных документов, свойство даты которых находится до заданной даты.
Предположим, у нас есть следующие классы:
public class RootItem
{
public string Id { get; set; }
public string Name{ get; set; }
public string PictureUrl { get; set; }
public List<Reservation> Reservations { get; set; }
}
public class Reservation
{
public string Name { get; set; }
public DateTime Date{ get; set; }
public int NrOfSeats { get; set; }
}
Итак, коллекциябудет выглядеть примерно так:
{
"_id": "5be2bb2fdfd6174938518af2",
"name": "John Doe",
"pictureUrl": "http://example.com/abc.jpg",
"reservations": [
{
"table": "abc",
"date": "1/1/2019",
"nrOfSeats": 5
},
{
"name": "xyz",
"date": "7/1/2019",
"nrOfSeats": 5
}
]
}
Я прочитал документы, я много читал здесь, на SO, но самое близкое, что я получил, было это:
var reservations = Collection
.Aggregate()
.Unwind<RootItem, Reservation>(x => x.Reservations)
.ToList()
.FindAll(r => r.Date > thresholdDate);
Запускэтот код я получил эту ошибку:
System.FormatException: 'Элемент' _id 'не соответствует ни одному полю или свойству класса' Reservation '
Поэтому я добавляюпроекция.Если я исключу только поле _id , которое я получу:
'Элемент' Создан 'не соответствует ни одному полю или свойству класса' Резервирование '
Таким образом, я вручную включаю другие поля (должны быть необязательными):
var reservations = Collection
.Aggregate()
.Unwind<RootItem, Reservation>(x => x.Reservations)
.Project<Reservation>(Builders<Reservation>.Projection
.Exclude("_id")
.Include(r => r.Name)
.Include(r => r.Date)
.Include(r => r.NrOfSeats))
.ToList()
.FindAll(r => r.Date > thresholdDate);
Но теперь я получаю Список с NrOfSeats и Именем, установленным на ноль, и Датой на 1/1/0001.
Как я могу получить сводный список всех резервирований в моей коллекции, для которых свойство date раньше или меньше заданной даты?