mongodb中的大阵列滤波器
我正在使用Mongo 3.4.10,现在无法升级 我有一个需要过滤的“左连接”(在3.4中我不能使用)。 目前,我使用and,但这在大型阵列(超过2000个元素)上失败 我尝试按照中的建议在后面添加,但我无法同时获得没有辅助元素的主元素 我的模式如下:mongodb中的大阵列滤波器,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在使用Mongo 3.4.10,现在无法升级 我有一个需要过滤的“左连接”(在3.4中我不能使用)。 目前,我使用and,但这在大型阵列(超过2000个元素)上失败 我尝试按照中的建议在后面添加,但我无法同时获得没有辅助元素的主元素 我的模式如下: 一个主集合(我们称之为“主集合”),带有ID和一些更有用的字段 一个辅助集合,具有到主集合的链接,它可以包含同一主id的许多元素。其中大多数是无关元素 让我们假设对于每个主id,我在第二个集合中有一个或没有相关元素。如果还有更多,我想使用最后一
- 一个主集合(我们称之为“主集合”),带有ID和一些更有用的字段
- 一个辅助集合,具有到主集合的链接,它可以包含同一主id的许多元素。其中大多数是无关元素
- 让我们假设对于每个主id,我在第二个集合中有一个或没有相关元素。如果还有更多,我想使用最后一个(元素有一个timestamp字段),但现在可以忽略这一点
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,当辅助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': []
}
]
}
}
]);
这在大型阵列上是可行的,但我无法再获得没有匹配辅助元素的主元素
关于如何提出这个请求有什么线索吗
我知道真正的解决方案是迁移到Mongo4.0,但在我的环境中这不是一个选项
编辑:包括@Fanpark建议,以获得主要的,没有次要的。
问题是,这仍然不会返回只有不相关的辅助项的主项。您的
$match
应该是以下{'$match':{'$or':[{'辅助项。相关':{'$eq':'true'}},{'secondaries':[]}
但我认为即使您必须使用$group
来重建$unwind
ed数组。@Fanpark问题是,这只匹配根本没有辅助对象的主对象,但我很难找到只有不相关辅助对象的主对象。我不需要对数组重新分组,因为我只有一个相关元素。你可以这样做{'$match':{'$or':[{'secondaries.related':{'$eq':'true'}},{$expr:{'$gte':[{$size:'$secondaries'},0]}}
遗憾的是,$expr只在mongo 3.6中可用:但我尝试给我每个有次要元素的主元素,但不是相关的。我对此有点绝望,并尝试其他方法(通过组合两个查询),但目前运气不佳。