Фильтровать иностранные документы на $ lookup - PullRequest
1 голос
/ 13 июня 2019

У меня отношение «один ко многим» между devices и events.Я пытаюсь запросить devices, при этом объединяя все его events, которые также должны соответствовать другому условию.

Вот соответствующие свойства каждой таблицы:

devices:

{
  networkId: String,
  serial: String // Unique device ID.
  ...
}

events:

{
  deviceSerial: String, // The "serial" field of the device this event is for.
  ts: Number // Unix epoch timestamp in seconds.
  ...
}

Я обнаружил, что синтаксис 3.6 для $lookup делает именно то, что я хочу, однако, похоже, он не работает.Я получаю правильные устройства, но массив events всегда возвращается пустым, но я точно знаю, что есть события, соответствующие условиям.

Мой конвейер:

[
  {
    $match: {
      networkId: 'N_660903245316632251'
    }
  },
  {
    $lookup: {
      from: 'events',
      let: {'deviceSerial': '$deviceSerial'},
      pipeline: [
        $match: {
          deviceSerial: '$$deviceSerial',
          ts: {$gte: 1556686800, $lte: 1559365199}
        }
      ]
    }
  }
]

Результаты успешно возвращаются с выбранными устройствами, но массив событий всегда пуст:

[
  {
    ...
    events: []
  }
  ...
]

1 Ответ

1 голос
/ 13 июня 2019

Здесь вы упускаете одну вещь: вам нужно использовать выражения ( $ expr ) для ссылки на переменные, которые определены в выражении let:

{
    $lookup: {
        from: 'events',
        let: {'deviceSerial': '$deviceSerial'},
        pipeline: [
            $match: {
                {
                    $expr: {
                        $and: [
                            { $eq: [ "$deviceSerial", "$$deviceSerial" ] },
                            { $gte: [ "$ts", 1556686800 ] },
                            { $lte: [ "$ts", 1559365199] }
                        ]
                    }
                }
            }
        ] 
    }
}
...