Получить плоский массив документов, встроенный в массив с фильтром по свойству документа в MongoDB - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть коллекция документов 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 раньше или меньше заданной даты?

1 Ответ

0 голосов
/ 02 февраля 2019

Я думаю, что если вы используете

collection.AsQueryable().SelectMany(s => s.Reservations).Where(r => r.Date > thresholdDate).ToList();

Это должно вернуть то, что вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...