MongoDB 2.6使用$strLenCP报错,求字符串长度计算替代方案
MongoDB 2.6版本替代$strLenCP计算字符串长度方案
报错原因
$strLenCP是MongoDB 3.4版本才新增的聚合运算符,你使用的2.6版本不支持该运算符,因此会抛出无效运算符的错误。
可用替代方案
方案1:聚合管道内动态计算长度(适用于临时查询场景)
利用MongoDB 2.6原生支持的$substr、$cond运算符组合实现长度计算:
原理:
$substr取超出字符串实际长度的位置时,会返回空字符串,通过逐层判断指定位置是否存在字符,即可累计得到字符串的总长度。
示例代码(计算content字段的字符串长度,并按长度排序):
db.yourCollection.aggregate([ { $project: { content: 1, // 可根据业务场景扩展判断层级,覆盖业务中可能出现的最大字符串长度即可 contentLength: { $cond: [{$ne: [{$substr: ["$content", 49, 1]}, ""]}, 50, {$cond: [{$ne: [{$substr: ["$content", 48, 1]}, ""]}, 49, {$cond: [{$ne: [{$substr: ["$content", 47, 1]}, ""]}, 48, // 中间省略中间层级的判断,可按需补充 {$cond: [{$ne: [{$substr: ["$content", 0, 1]}, ""]}, 1, 0] } ] } } } }, { $sort: {contentLength: -1} // 按字符串长度降序排序,升序改为1即可 } ])
方案2:冗余存储长度字段(适用于高频查询场景)
写入数据时额外新增对应字段存储字符串长度,后续聚合、排序直接使用预存的长度字段即可,性能远高于动态计算。
优化建议
如果业务条件允许,建议将MongoDB升级到3.4及以上版本,直接使用原生的$strLenCP、$strLenBytes运算符,无需额外兼容逻辑,性能也更稳定。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

