2016-06-24 6 views
0

Я изучаю Mongodb и пытаюсь реализовать штабелированные диаграммы из Mongodb. Я изо всех сил пытаюсь отобразить данные в соответствии с документом highcharts. Это то, что я сделал до сих пор:Mongodb + Stacked Highcharts

MongoDB документ:

{ 
    "_id" : ObjectId("576a.....b"), 
    "to: "Jane", 
    "mode" : "Open" 
} 
{ 
    "_id" : ObjectId("576a.....c"), 
    "to: "Jane", 
    "mode" : "Closed" 
} 
{ 
    "_id" : ObjectId("576a.....d"), 
    "to: "Smith", 
    "mode" : "Open" 
} 

MongoDB агрегат:

db.collection.aggregate([ 
{ 
$group : { 
    _id : {"to" : "$to", "mode": "$mode"}, 
    y : {$sum : 1} 
} 
}, { 
$project : { 
    "to" : "$_id.to", 
    "mode" : "$_id.mode", 
    "_id" : 0, 
    "y" : "$y" 
} 
}, { 
$group : { 
    _id : {"to" : "$to" }, 
    items : {$push : {item : "$mode", qty: "$y"}} 
} 
} 
]) 

Выход я получил:

[{ 
    "_id" : { 
    "to" : "Jane" 
}, 
"items" : [{ 
    "item" : "Open", 
    "qty" : 1 
}, { 
    "item" : "Closed", 
    "qty" : 1 

}] 
}, { 
    "_id" : { 
    "to" : "Smith" 
}, 
"items" : [{ 
    "item" : "Open", 
    "qty" : 1 
}] 

} 

}] 

Вместо этого я хочу следующий вывод для отображения Highcharts:

categories = ["Jane","Smith"] 
series = [{ 
    name : 'Open', 
    data: [1,1] //1 -open jane, 1- open smith 
}, { 
    name : 'Closed', 
    data : [1,0] //1 - closed jane, 0- closed smith 

}] 

Любая идея, как получить этот вывод? Благодаря!

+0

Любой, кто может мне помочь с агрегацией MongoDB, чтобы получить ожидаемый результат? – nair

+0

Невозможно получить результат с 'categories =' и 'series =' Но вы можете создать описанную структуру, используя методы 'map' или' forEach'. https://docs.mongodb.com/manual/reference/method/cursor.map/ – AstraSerg

ответ

0

Вы можете создать парсер, который преобразует ваш JSON из mongoDB в правый формат.

var data = [{ 
    "_id": { 
     "to": "Jane" 
    }, 
    "items": [{ 
     "item": "Open", 
     "qty": 1 
    }, { 
     "item": "Closed", 
     "qty": 1 

    }] 
    }, { 
    "_id": { 
     "to": "Smith" 
    }, 
    "items": [{ 
     "item": "Open", 
     "qty": 1 
    }] 
    }]; 

    var outputSeries = [{ 
     name: 'Open', 
     data: [] 
    }, { 
     name: 'Closed', 
     data: [] 
    }], 
    each = Highcharts.each; 

    each(data, function(serie, i) { 
    each(serie.items, function(point, j) { 
     if (point.item === 'Open') { 
     outputSeries[0].data.push(point.qty); 
     } else if (point.item === 'Closed') { 
     outputSeries[1].data.push(point.qty); 
     } 
    }); 
    }); 

Пример:

+0

Это работает - Спасибо! – nair

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