我在devices
和events
之间存在一对多的关系。我正在尝试查询devices
,同时将其所有events
都加入其中,这也必须匹配另一个条件。
以下是每个表的相关属性:
设备:
{
networkId: String,
serial: String // Unique device ID.
...
}
事件:
{
deviceSerial: String, // The "serial" field of the device this event is for.
ts: Number // Unix epoch timestamp in seconds.
...
}
我发现$lookup
的3.6语法完全可以实现我想要的功能,但是它似乎没有用。我得到了正确的设备,但是events
数组始终返回为空,但是对于某些事实,我知道存在符合条件的事件。
我的管道:
[
{
$match: {
networkId: 'N_660903245316632251'
}
},
{
$lookup: {
from: 'events',
let: {'deviceSerial': '$deviceSerial'},
pipeline: [
$match: {
deviceSerial: '$$deviceSerial',
ts: {$gte: 1556686800, $lte: 1559365199}
}
]
}
}
]
所选设备成功返回结果,但事件数组始终为空:
[
{
...
events: []
}
...
]
答案 0 :(得分:1)
这里缺少的一件事是,您需要使用表达式($expr)来引用let
语句定义的变量:
{
$lookup: {
from: 'events',
let: {'deviceSerial': '$deviceSerial'},
pipeline: [
$match: {
{
$expr: {
$and: [
{ $eq: [ "$deviceSerial", "$$deviceSerial" ] },
{ $gte: [ "$ts", 1556686800 ] },
{ $lte: [ "$ts", 1559365199] }
]
}
}
}
]
}
}