尝试使用 $avg 计算平均值并得到:参数必须是聚合管道运算符

Posted

技术标签:

【中文标题】尝试使用 $avg 计算平均值并得到:参数必须是聚合管道运算符【英文标题】:trying to calc average with $avg and got: arguments must be aggregate pipeline operators 【发布时间】:2022-01-06 21:23:50 【问题描述】:

收到此错误:参数必须是聚合管道运算符 这是将 bootcamp 作为 objectId 的课程“Schema”。

   const CourseSchema = new mongoose.Schema(

   bootcamp: 
        type: mongoose.Schema.ObjectId,
        ref: 'Bootcamp',
        required: true
    
  );

聚合:

 //static method to get avg of course tuitions
    CourseSchema.statics.getAverageCost = async function (bootcampId) 
    console.log('calculating avg cost... with bootcampId:' + bootcampId);
    const obj = await this.aggragate([
        $match:  bootcamp: bootcampId ,
        $group: 
            _id: '$bootcamp',
            averageCost:  $avg: '$tuition' 
        
    ]);
    console.log(obj);
    

在保存或删除之前调用聚合:

...

// Call getAvarageCost after save
CourseSchema.post('save', function () 
    this.constructor.getAverageCost(this.bootcamp);
)

// Call getAvarageCost before remove
CourseSchema.post('remove', function () 
    this.constructor.getAverageCost(this.bootcamp);
)

...

【问题讨论】:

【参考方案1】:

$match 和 $group 必须在不同的管道操作中

const cursor = this.aggregate([
   $match:  bootcamp: bootcampId  ,
  
    $group: 
      _id: '$bootcamp',
      averageCost:  $avg: '$tuition' ,
    ,
  ,
])
console.log(await cursor.toArray())

【讨论】:

嘿,谢谢,但现在我遇到了另一个错误问题:this.aggragate is not a function const obj = await this.aggragate 没关系 .. this.aggregate .... nottttt this.AGRRAGATE .. 2 天 .. 2 爱的日子 顺便说一句,你最后不需要“toArray” 哎呀错别字必须是aggregate toArray - 给你数组聚合给你聚合光标,异步迭代..

以上是关于尝试使用 $avg 计算平均值并得到:参数必须是聚合管道运算符的主要内容,如果未能解决你的问题,请参考以下文章

问下sqlserver求平均数avg函数怎样保留小数位啊?

SQL 平均值的计算

第9课 汇总数据

第9课 汇总数据

SQL GROUP BY子句,使用AVG在DATESPAN计算中获得浮点数2精度

计算数据框中特定列(SUM、AVG、STDEV)的所有嵌套级别聚合