Вот структура документа в MongoDB:MongoDB: Вычислить среднее значение все поля конкретного документа, которые встраиваются в виде списка в документе
{
"_id" : NumberLong(1),
"averageRating" : 2.5,
"date" : ISODate("2013-11-12T02:15:14.448Z"),
"filledBy" : "Degroote, Fred",
"results" : [
{
"answer" : "Very caring doctor. I am happy",
"name" : "comment",
"type" : "string"
},
{
"answer" : "4",
"name" : "premises",
"type" : "integer"
},
{
"answer" : "5",
"name" : "staff",
"type" : "integer"
},
{
"answer" : "0",
"name" : "provider",
"type" : "integer"
},
{
"answer" : "1",
"name" : "care",
"type" : "integer"
}
],
"tenantId" : NumberLong(2),
"token" : "38ae01f0-1203-4d10-9ff1-7c9fad1790cc",
"version" : NumberLong(0)
}
Нам необходимо вычислить среднее значение баллов ответить не соответствует имени результата «сотрудники 'в результатах всех документов, имеющих значение tenantId 2.
запрос MongoDB, который мы написали:
> db.surveyResults.aggregate({$match: {'tenantId': 2}}, {$unwind: '$results'}, {$match: {'results.type':'integer'}},{$group: {_id: '$results.name', averageSatisfaction: {$avg: '$results.answer'}}})
Но проблема в приведенном выше запросе MongoDB является что ответ на поле имеет строку типа. Есть ли способ решить эту проблему без изменения типа ответа на поле?
Мы нашли альтернативу, не вычисляя среднее значение. Вместо этого группируйте все ответы по имени и затем вычисляйте среднее значение извне. Вот запрос, который мы используем: > db.surveyResults.aggregate ({$ match: {'tenantId': 2}}, {$ project: {'results': 1}}, {$ unwind: '$ results' }, {$ match: {'results.type': 'integer'}}, {$ group: {_id: '$ results.name', ответы: {$ push: '$ results.answer'}}}) –
Рад, что вы нашли обходной путь. Может быть, мое решение может помочь кому-то другому. – rubenfa