MongoDB (pymongo) $ avg и $ stdDevPop не работают внутри $ project, но отлично работают внутри $ group - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь найти среднее ($avg) и стандартное отклонение ($stdDevPop) в коллекции, проверьте, больше ли среднее значение, чем значение стандартного отклонения, и, в зависимости от этого, используйте большееодин как optimalCredit значение.

Если я использую $avg и $stdDevPop внутри $group, они работают без проблем, но когда я помещаю их в $project, они возвращают Null

IЯ действительно новичок в 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 и th $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 голосов
/ 28 мая 2019

Я понял. Мне нужно было объявить среднее ($avg) и стандартное отклонение ($stdDevPop) в $group, а затем вызвать эти 2 из $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}
}
...