【发布时间】:2016-04-22 16:54:06
【问题描述】:
我正在尝试从 MongoDB 集合中获取 cmets(使用 Mongoose)并使用聚合管道计算 cmets 的数量和平均值。但是,当第一个 $match 没有返回任何内容时,脚本会因“无法读取未定义的属性 'avg'”错误而崩溃。
var q = Comment.aggregate([
{ $match: {
_post: this,
rating: { $gt: 0 },
}},
{ $group: {
_id: null,
avg: { $avg: "$rating" },
count: { $sum: 1 }
}}
]);
q.exec(function(err, result) {
cb(err, result[0].avg, result[0].count);
});
当我省略 _post $match 时,结果包含所有 cmets 的正确平均值和计数,但是当 $match 没有返回任何内容时,它只会抛出错误。如何解决?
【问题讨论】:
-
为什么需要
_post: this?聚合管道按顺序工作。$group将在上一个查询之后使用游标(如果存在)。 -
代码 sn-p 是 Post Mongoose 对象的实例方法的一部分。 _post:this 指的是对象本身,仅获取属于该特定帖子的 cmets。 $group 在前一阶段的空结果之后确实有效,但我只是看错了地方(见下面的答案)。