MongoDB(pymongo)$ avg和$ stdDevPop在$ project内不起作用,但是在$ group内它们可以完美地工作

时间:2019-05-24 16:15:36

标签: mongodb pymongo

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

如果我在$avg中使用$stdDevPop$group,它们可以正常工作,但是当我将它们放在$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}

1 个答案:

答案 0 :(得分:0)

我明白了。我需要在$avg中声明平均值($stdDevPop和标准差($group),然后从$project调用这2个

{'$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}
}