MongoDB中$sample聚合异常:$size参数类型错误求助
解决MongoDB聚合中$size参数错误的问题
错误原因
你收到的错误是因为聚合管道的第一个$project阶段里,使用了$size: '$favorited_by'计算点赞数。当集合中存在没有favorited_by字段,或者该字段不是数组类型的文档时,$size就会抛出参数类型错误。
解决方案
方案1:处理缺失/非数组的favorited_by字段
用$ifNull将缺失的favorited_by字段转为空数组,确保$size始终能拿到合法的数组参数:
[{ $project: { _id: '$_id', sender_id: '$sender_id', date_time: '$date_time', numberOfLikes: { $size: { $ifNull: ['$favorited_by', []] } } } }, { $match: { numberOfLikes: { $gte: 9 }, sender_id: { $nin: ['system', '848846'] }, 'UsedClessics.type': { $ne: 'reply' } } }, { $lookup: { from: 'UsedClessics', localField: '_id', foreignField: 'reply_id', as: 'UsedClessics' } }, { $sample: { size: 1 } }]
方案2:提前过滤不合格文档
在$project之前添加$match阶段,直接排除没有favorited_by字段或该字段不是数组的文档,减少后续计算的无效数据:
[{ $match: { favorited_by: { $exists: true, $type: 'array' }, sender_id: { $nin: ['system', '848846'] } } }, { $project: { _id: '$_id', sender_id: '$sender_id', date_time: '$date_time', numberOfLikes: { $size: '$favorited_by' } } }, { $match: { numberOfLikes: { $gte: 9 } } }, { $lookup: { from: 'UsedClessics', localField: '_id', foreignField: 'reply_id', as: 'UsedClessics' } }, { $match: { 'UsedClessics.type': { $ne: 'reply' } } }, { $sample: { size: 1 } }]
额外优化
把多个分散的$match阶段合并成一个(除了$lookup之后的match),能减少聚合管道的阶段数,提升查询效率。
内容的提问来源于stack exchange,提问作者Andew Meszaros
相关产品推荐
相关产品推荐

