我正在使用Mongo 3.4.10,现在无法升级。
我有一个“左连接”需要过滤(在3.4中,我不能使用uncorrelated sub-queries)。 现在,我将$addFields与$arrayElemAt和$filter结合使用,但是在大型数组(超过2000个元素)上失败。
我尝试按照$unwind的建议在$lookup之后this SO answer,但是我也无法获得没有次要元素的主要元素。
我的架构如下:
这是我使用的第一个解决方案:
return db.primary.aggregate([
{
$match:{
'id':{
$in:queryParam.ids
},
}
},
{
$lookup:{
from:'secondary',
localField:'id',
foreignField:'primary_id',
as:'secondaries'
}
},
{
$addFields:{
relevantSecondary:{
$arrayElemAt:[
{
$filter:{
input:'secondaries',
as:'secondary',
cond:{
$eq:[
'$$secondary.relevant',
'true'
]
}
}
},
0
]
},
}
}
]);
这项工作很好,给了我例外的结果。 当给定的主ID的辅助元素中有大量元素时,就会出现问题。 我得到
“次级匹配{$ match:{$ and:[{primary_id:{$ eq:\“ XXXXX \”}},{}]}}中的文档总大小超出了最大文档大小”
这是我尝试的方法,首先使用$ unwind:
return db.primary.aggregate([
{
$match:{
'id':{
$in:queryParam.ids
},
}
},
{
$lookup:{
from:'secondary',
localField:'id',
foreignField:'primary_id',
as:'secondaries'
}
},
{
$unwind: {
path: '$secondaries',
preserveNullAndEmptyArrays: true
}
},
{
$match: {
$or: [
{
'secondaries.relevant': {$eq: 'true'}
},
{
'secondaries': []
}
]
}
}
]);
这适用于大型数组,但是我再也无法获得没有匹配辅助元素的主要元素。
有关如何提出此请求的任何线索吗?
我知道真正的解决方案是迁移到Mongo 4.0,但这并不是我的选择。
编辑:包括@Fanpark建议,以使中学而没有中学。 问题在于,这仍然不会返回只有无关的辅助数据库。