Как отфильтровать вложенные объекты в массив документа в пн goose? - PullRequest
0 голосов
/ 11 апреля 2020

Мои данные хранятся для пользователя в следующем формате:

{
  name: 'XYZ',
  email: 'abc@gmail.com',
  password: 'encrypted',
  categories: [
    {
      name: 'category1',
      type: 'type1',
    },
    {
      name: 'category2',
      type: 'type2',
    }
  ],
  transactions: [
    {
      date: 2020-04-09T06:00:30.000Z,
      type: 'type1',
      category: 'category1',
      description: 'some desc',
    },

    {
      date: 2020-04-08T06:00:30.000Z,
      type: 'type2',
      category: 'category1',
      description: 'some desc',
    },

    {
      date: 2020-04-07T06:00:30.000Z,
      type: 'type3',
      category: 'category1',
      description: 'some desc',
    }
  ]
}

Я хочу получить данные конкретного пользователя после предоставления уникального электронного письма, но наряду с этим я хочу, чтобы транзакции фильтровались между двумя датами. Пример Мне нужны данные пользователя с email = abc@gmail.com и транзакции dates between 2020-04-08 and 2020-04-09.

Пример вывода выглядит следующим образом:

{
 name: 'XYZ',
 email: 'abc@gmail.com',
 categories: [...],
 transactions: [
    {
      date: 2020-04-09T06:00:30.000Z,
      type: 'type1',
      category: 'category1',
      description: 'some desc',
    },

    {
      date: 2020-04-08T06:00:30.000Z,
      type: 'type2',
      category: 'category1',
      description: 'some desc',
    }]
}

Или только транзакции между указанными датами для данного пользователя электронной почты тоже хорошо.

Попытка с помощью этого запроса

User.aggregate([
    {$match: {email: email}},
    {$unwind: '$transactions'},
    {$match: {'transactions.date': {$gt: startDate, $lt: endDate}}},
    {
      $group: {
        _id: '$_id',
        transactions: {
          $type: "$transactions.type",
          $category: "$transactions.category",
          $date: "$transactions.date",
          $description: "$transactions.decription"
        }
      }
    }
  ]).exec((err, data) => {
    if (err) throw err;
    console.log(data);
  })

Получение ошибки следующим образом The field 'transactions' must specify one accumulator

...