【问题标题】:MongoDB/Mongoose aggregate, stage result undefinedMongoDB/Mongoose 聚合,阶段结果未定义
【发布时间】: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 在前一阶段的空结果之后确实有效,但我只是看错了地方(见下面的答案)。

标签: node.js mongodb mongoose


【解决方案1】:

我看错地方了。错误消息不是指查询中的“avg”,而是指回调函数中的 result.avg。就在发布之前,我已将回调函数参数更改为 result[0].avg,现在错误消息是关于无法从 undefined 读取 '0'。

看错地方了。。发布得太早了。。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2018-08-01
    • 2013-09-13
    • 2021-07-10
    • 1970-01-01
    • 2020-12-28
    • 2019-01-06
    相关资源
    最近更新 更多