2013-04-11 5 views
0

Итак, я пытаюсь получить среднее значение по месяцам для моих данных и следовал шаблону, который я видел на нескольких сообщениях SO, но он возвращается как null для результата _id, и я не могу понять, почему. Дата в моей модели действительно является типом даты.Нулевой результат для проецируемого _id созданного объекта по запросу Mongo Aggregation

{ 
$match: { 
    date: {$gte: startDate, $lte: endDate } 
}, 
$project: { 
    'date': 1 
    , 'fatigue.percent': 1 
    , 'fitness.percent': 1 
    , 'maintenance.percent': 1 
    , 'substances.percent': 1 
    , 'unsafe.percent': 1 
    , 'created_on': { 
     month: { '$month': '$date' } 
    } 
} 
,$group: { 
     _id: '$created_on' 
    , averageFatigue: {$avg : '$fatigue.percent'} 
    , averageFitness: {$avg : '$fitness.percent'} 
    , averageMaintenance: {$avg : '$maintenance.percent'} 
    , averageSubstances: {$avg : '$substances.percent'} 
    , averageUnsafe: {$avg : '$unsafe.percent'} 
    } 
} 
+0

Пробовали ли вы с термином месяц: {$ за месяц: «$ дате '}? (Обратите внимание на кавычки вокруг оператора $ month) –

+0

Просто попробовал, не помог. – dariusriggins

ответ

2

оператор трубопровода выражения для $ проекта и $ группы должны быть заключены в фигурные скобки, как в $ матча:

db.test.aggregate(
{ 
    $match: { 
      date: {$gte: startDate, $lte: endDate } 
      } 
}, 
{ 
    $project: { 
    'date': 1 
    , 'fatigue.percent': 1 
    , 'fitness.percent': 1 
    , 'maintenance.percent': 1 
    , 'substances.percent': 1 
    , 'unsafe.percent': 1 
    , 'created_on': { 
        month: { '$month': '$date' } 
        } 
    } 
}, 
{ 
    $group: { 
     _id: '$created_on' 
    , averageFatigue: {$avg : '$fatigue.percent'} 
    , averageFitness: {$avg : '$fitness.percent'} 
    , averageMaintenance: {$avg : '$maintenance.percent'} 
    , averageSubstances: {$avg : '$substances.percent'} 
    , averageUnsafe: {$avg : '$unsafe.percent'} 
    } 
} 
) 
+0

Работает отлично, спасибо! – dariusriggins