MongoDB mapReduce报错:Object.values is not a function问题咨询
解决MongoDB mapReduce中Object.values()不支持的报错
这个报错的核心原因很明确:你当前使用的MongoDB版本内置的JavaScript引擎不支持Object.values()方法——这个方法是ES2017标准新增的,而旧版本MongoDB的JS环境(基于SpiderMonkey)还没兼容这个特性,所以会抛出TypeError: Object.values is not a function。
快速修复:改用Object.keys()遍历对象
我们可以用兼容性更好的Object.keys()来替代Object.values(),它能获取对象的所有键名,再通过键名拿到对应的item值。修改后的map函数如下:
var mapFun = function () { // 遍历favoriteItems的所有键名 Object.keys(this.favoriteItems).forEach(key => { const item = this.favoriteItems[key]; // 这里建议emit item的_id而非整个item对象,避免对象序列化导致的统计偏差 emit(item._id, 1); }) }
为什么要emititem._id而不是整个item?因为如果直接emit整个item对象,MongoDB会对对象进行序列化,即使两个item的内容完全一致,也可能因为对象引用不同被判定为不同的key,最终导致统计结果不准确。用唯一的_id作为key才能保证统计的正确性。
可选:简化你的reduce函数
你的reduce函数可以用数组的reduce()方法简化代码,更简洁易读:
var redFun = function (itemId, values) { return values.reduce((totalCount, current) => totalCount + current, 0); }
长期方案:升级MongoDB版本
如果你的业务允许,也可以考虑将MongoDB升级到4.4及以上版本——从这个版本开始,MongoDB更新了内置的JavaScript引擎,支持更多ES6+特性,包括Object.values()、箭头函数等,这样你原来的map函数就可以直接使用了。
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

