2013-02-22 5 views
3

Я хочу сгруппировать коллекцию, а затем вычислить среднее значение в одном поле групп.Средние значения для элементов группы с использованием Mongo Aggregation Framework

установки я мой дб и содержание, как это:

use testdb 
db.bla.insert({"service": "A", "tet": "1"}) 
db.bla.insert({"service": "A", "tet": "100"}) 
db.bla.insert({"service": "A", "tet": "150"}) 
db.bla.insert({"service": "B", "tet": "10"}) 
db.bla.insert({"service": "B", "tet": "20"}) 
db.bla.insert({"service": "B", "tet": "25"}) 

Теперь я хочу, число всех услуг «A» и «B», а средняя Tet за все услуги «A» и «B». Я попытался это:

db.bla.aggregate({ "$group": { _id: "$service", requests: { $sum:1}, averagetet: { $avg: "$tet"}}}) 

Но это всегда дает мне «0» для средних значений. Что мне здесь не хватает?

ответ

9

Вы используете строковые значения на tet поле

db.bla.insert({"service": "B", "tet": "25"}) //this quotes creates a String value. 

Вы должны вставить с помощью номера, следующим образом:

db.bla.insert({"service": "B", "tet": 25}) 

Подставив правильные значения, MongoDB дает правильное среднее значение tet поля.

db.bla.insert({"service": "A", "tet": 1}) 
db.bla.insert({"service": "A", "tet": 100}) 
db.bla.insert({"service": "A", "tet": 150}) 
db.bla.insert({"service": "B", "tet": 10}) 
db.bla.insert({"service": "B", "tet": 20}) 
db.bla.insert({"service": "B", "tet": 25}) 

db.bla.aggregate({ "$group": { _id: "$service", requests: { $sum:1}, averagetet: { $avg: "$tet"}}}) 
{ 
    "result": [ 
    { 
     "_id": "B", 
     "requests": 3, 
     "averagetet": 18.333333333333332 
    }, 
    { 
     "_id": "A", 
     "requests": 3, 
     "averagetet": 83.66666666666667 
    } 
    ], 
    "ok": 1 
} 
+0

Спасибо, что было просто :-) – pitseeker

+0

как я могу найти среднее количество запросов на _id? –

+0

Вам нужно добавить только после первой $ group другую группу, такую ​​как «$ group: {_ id: null, avgreq: {$ avg:" $ requests "}}". Учтите, что вы не можете взять avg tet за id и глобальные avg-запросы в том же запросе. –

Смежные вопросы