如何在猫鼬的集合中找到文档项的平均值?

Posted

技术标签:

【中文标题】如何在猫鼬的集合中找到文档项的平均值?【英文标题】:How can I find Average of a document item in a collection in mongoose? 【发布时间】:2021-02-06 05:17:48 【问题描述】:
   const scoreSchema = new mongoose.Schema(
    rollno:
        type:Number,
        unique: true
    ,
    first_round:
        type:Number,
        validate(value)
            if(value > 10)
                throw new Error('Maximum marks is 10')
            
        
    ,
    second_round:
        type:Number,
        validate(value)
            if(value > 10)
                throw new Error('Maximum marks is 10')
            
        
    ,
    third_round:
        type:Number,
        validate(value)
            if(value > 10)
                throw new Error('Maximum marks is 10')
            
        
    ,
    total:
        type:Number,
        
);

我需要找到所有合并记录的 first_roundsecond_round 等的平均值。我怎样才能做到这一点?我无法弄清楚我们如何在猫鼬中找到平均值。任何帮助将不胜感激。

【问题讨论】:

你能分享你想要的输出格式吗? 我想分别求出每一轮的平均值。不仅针对特定的卷号,而且针对所有记录,基本上针对猫鼬中的所有卷号。比如说我们有 1 到 10 的卷号,即 10 条记录,我们必须分别找到所有 10 个卷号的 first_round 和 second_round 和 third_round 的平均值。 【参考方案1】:

如果您想要合并所有记录的平均值,请尝试aggregate(),

$group null 并使用 $avg 平均所有字段
let result = await ModelName.aggregate([
  // match condition to match for specific rollno
  //  $match:  rollno:  $in: [1,2]   ,
  
    $group: 
      _id: null,
      total_average:  $avg: "$total" ,
      first_round:  $avg: "$first_round" ,
      second_round:  $avg: "$second_round" ,
      third_round:  $avg: "$third_round" 
    
  
],  allowDiskUse: true );
console.log(result);

Playground

【讨论】:

我想分别求出每一轮的平均值。不仅针对特定的卷号,而且针对所有记录,基本上针对猫鼬中的所有卷号。 谢谢,知道了。最后一个问题。如何在 console.log 中显示此输出? 通过这样做,我只得到了一个巨大的对象,看起来像: AggregationCursor _readableState: ReadableState objectMode: true, highWaterMark: 16, buffer: BufferList head: null, tail: null,长度:0 , 用属性allowDiskUse: true 更新答案试试看,但我不确定你到底错过了什么或做错了。 这是我的代码:imgur.com/a/TWIaXhU,我做错了什么?【参考方案2】:

您可以使用mongoDB aggregation 实现此目的。在aggregation 中,您可以使用$group 来评估所有记录的每一轮的平均值。

db.sales.aggregate(
 [
   
   $group:
     
       _id: "$item",
       first_round_av:  $avg: "$first_round" ,
       second_round_av:  $avg: "$second_round" ,
       third_round_av:  $avg: "$third_round" ,
     
   
  ]
 )

【讨论】:

我想分别求出每一轮的平均值。不仅针对特定的卷号,而且针对所有记录,基本上针对猫鼬中的所有卷号。比如说我们有 1 到 10 的卷号,即 10 条记录,我们必须分别找到所有 10 个卷号的 first_round 和 second_round 和 third_round 的平均值。 @pranshuverma 我已经更新了我的答案。这是为所有记录分别获取所有轮次平均值的最简单方法。

以上是关于如何在猫鼬的集合中找到文档项的平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使子文档在猫鼬的特定日期过期?

如何在猫鼬的数组中使用不同类型的模式?

如何在猫鼬的 document.save() 回调中隐藏字段?

如何在猫鼬的路由器中等待函数完成其所有内部表达式?

如何在猫鼬中异步填充嵌套对象?

如何从猫鼬的另一个集合中计算文档?