You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:45:47