Объекты, на которые ссылается mongodb, внутри массива - PullRequest
0 голосов
/ 06 февраля 2020

Я использую пн goose в nodejs. Я пытаюсь запросить некоторые поля, которые содержат список, на который ссылаются объекты. Я создал две схемы

PILOT

var PilotSchema = new mongoose.Schema({
    races: [{type: mongoose.Schema.Types.ObjectId, ref: 'Race'}],
});

RACE

var RaceSchema = new mongoose.Schema({
    start_ms: Number,
});

Здесь я написал только соответствующие поля.

В схеме гонки у меня есть ключ start_ms, который указывает дату начала гонки в миллисекундах, а в поле PilotSchema races я сохраняю ссылки на многие гонки.

Что я хочу сделать, это:

  • Сделать дату в будущем (my_date) в миллисекундах
  • Получить все пилоты, у которых нет гонки в интервале (my_date - 2_hours, my_date + 2_hours)

Я пытаюсь сделать пример для объяснения лучше.

Моя дата: 23 февраля 2020 - 12:00:00 (в миллисекундах),

На пилотном поле races У меня есть много рефенсов на RaceSchema, и на каждом объекте, к которому добавлен объект, есть время начала гонки.

Теперь запрашиваю коллекцию пилотов, которую я хочу восстановить всех пилотов, у которых на поле races нет гонки, стартовавшей во время (Feb 23 2020 - 10:00:00 - Feb 23 2020 - 14:00:00)

. это запрос, но не работает

races: {$not:
  {$elemMatch: 
    {start_ms: 
      { "$gt" : min_time, "$lt" : max_time }
    }
  }
}

Где

min_time, max_time = my_date - 2_hours, my_date + 2_hours

На самом деле я не знаю, как это сделать, я видел, что для получения числа в интервале я могу использовать $gt и $lt, но я не понимаю, как запросить массив ссылочных объектов, которые соответствуют этим конкретным c условиям.

1 Ответ

0 голосов
/ 06 февраля 2020

Для этого вам нужно написать агрегированный запрос, который найдет вашу ссылку на races из pilot и отфильтровать их по вашему состоянию

 Pilot.aggregate([
            {
                $lookup:{
                    from:'races',
                    localField:'races',
                    foreignField:'_id',
                    as:'races'
                }
            },{
                $unwind:'$races'
            },
            {
                $match:{
                    'races.start_ms':{
                        "$gt" : min_time, "$lt" : max_time
                    }
                }
            },{
                $group:{
                    _id:'$_id',
                    name:{$first:'$name'}
                }
            }
        ]);

Предполагая, что у вас есть name в ваша pilot схема, вы можете получить список всех таких pilots, написав этот запрос

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