我正在尝试使用时间段进行聚合。然后,我想返回一个每天充满值的数组(没有找到文档时为0)。 aggeagate函数非常有效,但当我替换回调(以前称为console.log)时,这样:
Star.aggregate([{
$match: {
"mod": new mongoose.Types.ObjectId("53765a122c0cda28199df3f4"),
"time_bucket.month": new TimeBucket().month
}
},
{
$group: {
_id: "$time_bucket.day",
stars: {
"$sum": 1
}
}
},
{
$sort: {
'_id': 1
}
}],
function (err, mods) {
console.log(err, mods);
mods = mods.map(function (model) {
return model.toObject ? model.toObject() : model
});
var i, time, docs = [];
var hasGap = function (a, b) {
a = a.replace(/-/g, '');
b = b.replace(/-/g, '');
return a - b !== 1
}
var process = function (i, mods, docs) {
if (hasGap(mods[i]._id, mods[i + 1]._id)) {
docs.push(0);
return process(i, mods, docs)
}
docs.push(mods[i].stars);
return process(i + 1, mods, docs)
};
process(0, mods, docs);
console.log(docs);
});
我明白了:
C:\Users\Me\Nodejs\node_modules\mongoose\node_modules\mongodb\lib\mongodb\connection\base.js:245
throw message;
^
RangeError: Maximum call stack size exceeded
答案 0 :(得分:2)
您的process
函数是递归的,并且没有通过不再调用process
来破坏递归的路径。经典的无限递归堆栈溢出。
解决方案是更改process
函数,以便检查是否在mods
结果文档数组的末尾,然后只返回该点,而不是再次调用自身。
所以检查如下:
if (i >= mods.length) return;