首页 > 解决方案 > MongoDB (pymongo) $avg 和 $stdDevPop 在 $project 中不起作用,但它们在 $group 中完美运行

问题描述

我试图在集合中找到平均值($avg)和标准偏差($stdDevPop),检查平均值是否大于标准偏差值,并根据此值使用较大的值作为optimalCredit值。

如果我使用$avgand $stdDevPopinside $group,它们可以正常工作,但是,当我将它们放入 a$project时,它们会返回Null

我对 Mongo 真的很陌生(昨天早上我做了第一个查询)所以我知道我必须理解错误。

这是我用来比较平均值 ( $avg) 和标准偏差 ( $stdDevPop) 的代码:

{'$match':
      {'charRange': 
          {'$gt': 0},
      'countPar': 
          {'$gte': 0}
},

{'$group':
      {'_id': 
          {'charRange': '$charRange', 'parNr': '$countPar'},
       'count': 
          {'$sum': 1}
      }
},

{'$project':
     {'optimalCredit':
          {'$cond':
              {'if':
                    {'$gt': [
                             {'$avg': 'credit'}, 
                             {'$stdDevPop': 'credit'}
                            ]
                    },
               'then': 
                    {'$avg': '$credit'},
               'else': 
                    {'$stdDevPop': '$credit'}
              }
          }
     }
},

{'$sort': 
     {'optimalCredit': -1}
}

这是我测试的代码,用于查看是否有效$avg$stdDevPop返回数据:

{'$match': 
     {'charRange': 
          {'$gt': 0},
     'countPar': 
          {'$gte': 0},
     }
},

{'$group': 
    {'_id': 
          {'charRange': '$charRange', 'parNr': '$countPar'},
           'creditAvg': 
                 {'$avg': '$credit'},
           'creditStdDev': 
                 {'$stdDevPop':'$credit'},
           'count': {'$sum': 1}
    }
}

这是我在使用时得到的$project

{'_id': {'parNr': 7, 'charRange': 1500}, 'optimalCredit': None}

$project如果我删除并移动$avg并进入,这就是我得到$stdDevPop$group

{'_id': {'charRange': 1500, 'parNr': 7}, 'creditStdDev': 19.430788855719562, 'count': 9, 'creditAvg': 16.0}

最后,这是它应该看起来的样子(使用上面的数字):

{'_id': {'parNr': 7, 'charRange': 1500}, 'count': 9, 'optimalCredit': 19.430788855719562}

标签: mongodbpymongo

解决方案


我得到了它。我需要在 中声明平均值 ( $avg) 和标准差 ( $stdDevPop),$group然后从$project

{'$match':
      {'charRange': 
          {'$gt': 0},
      'countPar': 
          {'$gte': 0}
},

{'$group':
      {'_id': 
          {'charRange': '$charRange', 'parNr': '$countPar'},
       'count': {'$sum': 1},
       'creditAvg': {'$avg': '$credit'},
       'creditStdDev': {'$stdDevPop': '$credit'}
      }
},

{'$project':
     {'count': '$count',
      'creditAvg': '$creditAvg',
      'creditStdDev': '$creditStdDev',
      'optimalCredit':
          {'$cond':
              {'if':
                    {'$gt': [
                             '$creditAvg', 
                             '$creditStdDev'
                            ]
                    },
               'then': '$creditAvg',
               'else': '$creditStdDev'
              }
          }
     }
},

{'$sort': 
     {'optimalCredit': -1}
}

推荐阅读