Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb中的大阵列滤波器_Mongodb_Aggregation Framework - Fatal编程技术网

mongodb中的大阵列滤波器

mongodb中的大阵列滤波器,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在使用Mongo 3.4.10,现在无法升级 我有一个需要过滤的“左连接”(在3.4中我不能使用)。 目前,我使用and,但这在大型阵列(超过2000个元素)上失败 我尝试按照中的建议在后面添加,但我无法同时获得没有辅助元素的主元素 我的模式如下: 一个主集合(我们称之为“主集合”),带有ID和一些更有用的字段 一个辅助集合,具有到主集合的链接,它可以包含同一主id的许多元素。其中大多数是无关元素 让我们假设对于每个主id,我在第二个集合中有一个或没有相关元素。如果还有更多,我想使用最后一

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

我有一个需要过滤的“左连接”(在3.4中我不能使用)。 目前,我使用and,但这在大型阵列(超过2000个元素)上失败

我尝试按照中的建议在后面添加,但我无法同时获得没有辅助元素的主元素

我的模式如下:

  • 一个主集合(我们称之为“主集合”),带有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中可用:但我尝试给我每个有次要元素的主元素,但不是相关的。我对此有点绝望,并尝试其他方法(通过组合两个查询),但目前运气不佳。