在mongobd中过滤大型数组

时间:2019-06-05 09:37:12

标签: mongodb aggregation-framework

我正在使用Mongo 3.4.10,现在无法升级。

我有一个“左连接”需要过滤(在3.4中,我不能使用uncorrelated sub-queries)。 现在,我将$addFields$arrayElemAt$filter结合使用,但是在大型数组(超过2000个元素)上失败。

我尝试按照$unwind的建议在$lookup之后this SO answer,但是我也无法获得没有次要元素的主要元素。

我的架构如下:

  • 一个主要集合(我们称其为“主要”),带有ID和一些更有用的字段。
  • 辅助集合,具有指向主集合的链接,该集合可以包含许多具有相同主集合ID的元素。它们大多数无关紧要。
  • 让我们假设,对于每个主要ID,我在次要集合中都没有一个相关元素。如果还有更多,我想使用最后一个(元素有一个时间戳字段),但是现在可以忽略不计。

这是我使用的第一个解决方案:

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建议,以使中学而没有中学。 问题在于,这仍然不会返回只有无关的辅助数据库。

0 个答案:

没有答案