Highcharts graph X-axis label for different date ranges - php

I have written a below code which generates a area graph for selected dates (to and from dates).
$(document).ready(function() {
var options = {
"series": [{
"showInLegend": false,
"color": "#D0D0D0",
"name": "Revenue",
"data": [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}],
"credits": {
"enabled": false
},
"chart": {
"renderTo": "highchart_id",
"defaultSeriesType": "area",
"shadow": true
},
"title": {
"text": null,
"align": "center",
"x": 0,
"y": 20
},
"xAxis": {
"type": "datetime",
"dateTimeLabelFormats": {
"month": "%e. %b",
"year": "%b"
},
"labels": {
"enabled": "false"
}
},
"legend": {
"enabled": true
},
"yAxis": {
"title": {
"text": ""
},
"labels": {
"enabled": true
}
},
"plotOptions": {
"area": {
"stacking": "normal",
"lineColor": "#3E3E3E",
"lineWidth": 3,
"marker": {
"lineWidth": "1",
"lineColor": "#3E3E3E",
"states": {
"hover": {
"enabled": true,
"radius": 1
}
}
}
},
"series": {
"pointStart": 1335823200000,
"pointInterval": 86400000
}
}
};
var chart = new Highcharts.Chart(options);
});​
The interval of dates on x-axis is coming one day less. here the series value 2 is for 10 may whereas it is showing for 9 may in graph.
I am new to this highchart, can anybody advice the solution please and let me known if you need any more clarification on the problem.

Try adding this code before declaring the chart
Highcharts.setOptions({
time: {
useUTC: false
}
});
By default highchart used UTC times. By adding the code above it will use the time zone of the browser.

Related

JSON nested array parse via PHP

I need to loop through and print all nested data within the "players" array and sort by "wonAmount." I can get my PHP to print out a single value, which I target, but I can't get it to work when I try the foreach loop. So instead, it prints out "array."
JSON
{
"tournamentID": 65,
"gameType": "Holdem",
"name": "TRI KRALJA ZA EVROPU",
"start": "2022-04-07 13:30:00",
"status": "Finished",
"buyIn": 100000,
"entryFee": 10000,
"guaranteedPrize": 12500000,
"rebuyFee": 100000,
"rebuyRake": 10000,
"addonFee": 0,
"addonRake": 0,
"tableSize": 9,
"speed": "Turbo",
"players": [
{
"id": 1000000,
"alias": "demo1",
"rank": 1,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 6250000
},
{
"id": 1000005,
"alias": "demo6",
"rank": 2,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 3750000
},
{
"id": 1000087,
"alias": "demo10",
"rank": 3,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 2500000
},
{
"id": 1000008,
"alias": "demo9",
"rank": 4,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000078,
"alias": "demo15",
"rank": 5,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000002,
"alias": "demo3",
"rank": 6,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000006,
"alias": "demo7",
"rank": 7,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000090,
"alias": "demo13",
"rank": 8,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000171,
"alias": "demo14",
"rank": 9,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000088,
"alias": "okokoke",
"rank": 10,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000007,
"alias": "demo8",
"rank": 11,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000086,
"alias": "demo11",
"rank": 12,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000004,
"alias": "demo5",
"rank": 13,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000001,
"alias": "demo2",
"rank": 14,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000003,
"alias": "demo4",
"rank": 15,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
},
{
"id": 1000077,
"alias": "helloworld",
"rank": 16,
"rebuyCount": 0,
"addonCount": 0,
"wonAmount": 0
}
]
}
first, you need to decode the json using json_decode then you need to sort & print the player's array
$data = json_decode($json_data,true);
//extract the players from json
$players = $data["players"];
//sort players array
$wonAmount = array();
foreach ($players as $key => $row)
{
$wonAmount[$key] = $row['wonAmount'];
}
array_multisort($wonAmount, SORT_DESC, $players);
//print players data
foreach ($players as $player)
{
//add here any keys you want to print from player array
echo $player["id"];
}

Compare Values in multiple arrays

I've been stuck on trying to figure this out for a few hours now.
I'm using cURL and PHP to get data from an API and then display that data in a table. I have my table setup to show start position of a race, where they finished, the name of the person, and how far behind they finished.
In my column for how far behind they finished the API doesn't take into account that somebody might not complete all the laps in the race. For example 2nd place finished 4.285 seconds behind the leader, but 14th place finished 0.929 behind the leader because they were a lap behind and in between the leader and second place.
I'm trying to figure out how to find the first position that didn't complete all the laps (this could be a different position for every race) and then every position after the first person a lap behind. If that makes sense.
Below is the API response and I'm trying to compare data from the ResultTime key.
{
"RequestValid": 1,
"ItemsReturned": 1,
"Classes": [
{
"Races": [
{
"RaceName": "Feature",
"RaceType": "Feature",
"RaceOrder": 1,
"RaceLevel": "A",
"RaceLaps": 50,
"RaceTime": "00:27:39.532",
"RacePresenter": "",
"RaceNotes": "",
"RaceStatus": "Completed",
"Results": [
{
"ResultPlace": 1,
"ResultStart": 4,
"ResultTime": "1659.532",
"ResultCarNum": "49",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 2,
"ResultStart": 2,
"ResultTime": "1663.817",
"ResultCarNum": "1",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 3,
"ResultStart": 7,
"ResultTime": "1664.368",
"ResultCarNum": "28",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 4,
"ResultStart": 13,
"ResultTime": "1664.544",
"ResultCarNum": "1T",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 5,
"ResultStart": 1,
"ResultTime": "1665.218",
"ResultCarNum": "7",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 6,
"ResultStart": 8,
"ResultTime": "1666.842",
"ResultCarNum": "01",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 7,
"ResultStart": 10,
"ResultTime": "1668.640",
"ResultCarNum": "14",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 8,
"ResultStart": 15,
"ResultTime": "1670.214",
"ResultCarNum": "8",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 9,
"ResultStart": 21,
"ResultTime": "1672.037",
"ResultCarNum": "111V",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 10,
"ResultStart": 9,
"ResultTime": "1674.171",
"ResultCarNum": "44",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 11,
"ResultStart": 17,
"ResultTime": "1674.247",
"ResultCarNum": "16",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 12,
"ResultStart": 19,
"ResultTime": "1674.732",
"ResultCarNum": "72",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 13,
"ResultStart": 23,
"ResultTime": "1675.363",
"ResultCarNum": "99B",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 14,
"ResultStart": 16,
"ResultTime": "1660.461",
"ResultCarNum": "10",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 15,
"ResultStart": 24,
"ResultTime": "1663.480",
"ResultCarNum": "B1",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 16,
"ResultStart": 22,
"ResultTime": "1666.772",
"ResultCarNum": "7R",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 17,
"ResultStart": 6,
"ResultTime": "1669.867",
"ResultCarNum": "20",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 18,
"ResultStart": 14,
"ResultTime": "1673.277",
"ResultCarNum": "111",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 19,
"ResultStart": 12,
"ResultTime": "1387.076",
"ResultCarNum": "19R",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 20,
"ResultStart": 20,
"ResultTime": "1353.423",
"ResultCarNum": "0H",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 21,
"ResultStart": 5,
"ResultTime": "1340.342",
"ResultCarNum": "11",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 22,
"ResultStart": 11,
"ResultTime": "1284.877",
"ResultCarNum": "76",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 23,
"ResultStart": 3,
"ResultTime": "962.947",
"ResultCarNum": "39",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 24,
"ResultStart": 18,
"ResultTime": "239.697",
"ResultCarNum": "23B",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
},
{
"ResultPlace": 25,
"ResultStart": 25,
"ResultTime": "156.942",
"ResultCarNum": "42",
"ResultDNF": 0,
"ResultDNS": 0,
"ResultDQ": 0,
}
]
},
]
}
UPDATE 2 to show code
foreach ($raceresults as $raceresult) {
//Checking if race has a time
if ($raceresult['ResultTime'] == "0.000") {
$racetime = "No Time";
$laptimebehindpadded = "No Time";
} else {
//Getting Time of Race
$racetime = $raceresult['ResultTime'];
//Taking leaders overall time and subtracting each position to get time behind.
$laptimebehind = $quicktime - $racetime;
//Converting time behind to show 3 decimal places
$laptimebehindpadded = sprintf('%0.3f', $laptimebehind);
}
}
echo $laptimebehindpadded;
Have a $priorResultTime = 0 and a $lapBehind = 0. As you foreach() through the result array, compare $result['ResultTime'] with $priorResultTime.
$priorResultTime = 0;
$lapBehind = 0;
foreach(... as $result) {
if ($result['ResultTime'] < $priorResultTime) {
$lapBehind++;
}
$priorResultTime = $result['ResultTime'];
}
Your output can now take advantage of the $lapBehind variable, and indicate how many laps behind the leader a racer was, along with their relative time.

Highchart Array From Ajax

I have array From ajax Responses Look Like This
[
{
"name":"online",
"data":["34","155","12"]
},
{"name":"ofline",
"data":["34","155","12"]
}
]
ANd I want to add to Highchart Using ajax look this , but thats Wrong
$.getJSON("MYURL", {"cab":cab,"spv":spv,"sls":sls,"rg":rg}, function(data){
options.series = data;
var chart = new Highcharts.Chart(options);
});
In your example, the yAxis is missing.
Besides, the data must be under following format:
{
name: 'online',
marker: {
symbol: 'diamond'
},
data: [0, 0, 0, 0, 0, 0, 34, 155, 12, 0, 0, 0]
},{
name: 'offline',
marker: {
symbol: 'square'
},
data: [0, 0, 0, 0, 0, 0, 291, 182, 37, 0, 0, 0]
}
For more details, view this
The data array must be an array of numbers, not the strings - you need to change that on the backend site while rendering data or parse the data to an array of numbers just before to insert to the chart.
Demo: https://jsfiddle.net/BlackLabel/twkxezpy/
let dataFromDataBase = [{
"name": "online",
"data": [34, 155, 12]
},
{
"name": "ofline",
"data": [34, 155, 12]
}
];

how to get json value that has no key

i am using php to get the json values and have no problem looping though the data and echoing the SteamName, Level, Experience and more. However I do not know how to echo the steamid number 7656119801319... per proile.
json file:
{
"FURNACES": {},
"PROFILE": {
"76561198013191579": {
"SteamName": "Cayos",
"Level": 22,
"Experience": 1592,
"Agility": 22,
"Strength": 22,
"Intelligence": 22,
"StatsPoints": 66,
"SkillPoints": 2,
"Skills": {
"lumberjack": 20
},
"Preferences": {
"ShowXPMessagePercent": 0.25,
"ShowCraftMessage": true,
"UseBlinkArrow": true,
"AutoToggleBlinkArrow": true
}
},
"76561198113765447": {
"SteamName": "CaptainCheesy",
"Level": 31,
"Experience": 3576,
"Agility": 31,
"Strength": 70,
"Intelligence": 70,
"StatsPoints": 15,
"SkillPoints": 5,
"Skills": {
"miner": 8,
"lumberjack": 10,
"hunter": 8
},
"Preferences": {
"ShowXPMessagePercent": 0.25,
"ShowCraftMessage": true,
"UseBlinkArrow": true,
"AutoToggleBlinkArrow": true
}
},
"76561198141845337": {
"SteamName": "Carrot",
"Level": 3,
"Experience": 409,
"Agility": 3,
"Strength": 3,
"Intelligence": 3,
"StatsPoints": 9,
"SkillPoints": 3,
"Skills": {},
"Preferences": {
"ShowXPMessagePercent": 0.25,
"ShowCraftMessage": true,
"UseBlinkArrow": true,
"AutoToggleBlinkArrow": true
}
},
"76561198012539649": {
"SteamName": "Booglee",
"Level": 3,
"Experience": 110,
"Agility": 3,
"Strength": 3,
"Intelligence": 3,
"StatsPoints": 9,
"SkillPoints": 3,
"Skills": {},
"Preferences": {
"ShowXPMessagePercent": 0.25,
"ShowCraftMessage": true,
"UseBlinkArrow": true,
"AutoToggleBlinkArrow": true
}
},
"333228975": {
"SteamName": "SYN Gaurd",
"Level": 0,
"Experience": 0,
"Agility": 0,
"Strength": 0,
"Intelligence": 0,
"StatsPoints": 0,
"SkillPoints": 0,
"Skills": {},
"Preferences": {
"ShowXPMessagePercent": 0.25,
"ShowCraftMessage": true,
"UseBlinkArrow": true,
"AutoToggleBlinkArrow": true
}
}
}
}
My PHP Code:
$url = 'C:\Users\plosey\Desktop\GameServers\Rust\steam\server_syn1\server\syn1\oxide\data\Hunt_Data.json'; //Url to the cars api
$content = file_get_contents($url);
$json = json_decode($content);
foreach($json->PROFILE as $user) {
echo $user->SteamName;
echo $user->NEED STEAM ID HERE; // This is the line that is not correct.
}
so in short i would need to not only echo the SteamName but the Steamid number from the same profile.
Instead of
foreach($json->PROFILE as $user) {
use
foreach ($json->PROFILE as $steamid => $user) {
Try below code to print id. $stremId will print your ID. You can replace it with any variable name.
$json = json_decode($json);
foreach($json->PROFILE as $streamId => $user) {
echo $user->SteamName;
echo $streamId;
}
try this
foreach($json->PROFILE as $key => $user) {
echo $key .' => '.$user->SteamName."<br/>";
}

Aggregate mongo data php

I have collection of 113 documents. It is data from departments of university. There are 3 types of departments:
natural science departments => "chairtype" = "E",
humanities departments => "chairtype" = "G",
creative departments => "chairtype" = "T"
Every document contains fields with the same names:
"mijczjeqeo"
"vmfqvfjptu"
"fwtweaeeba"
...
and so on
113 people fill these fields from the web form every month. 1 person fills 1 document. After filling I make history of values in every document by php script.
"mijczjeqeo" value moves to "versions.0.content.mijczjeqeo"
"vmfqvfjptu" value moves to "versions.0.content.vmfqvfjptu"
"fwtweaeeba" value moves to "versions.0.content.fwtweaeeba"
...
and so on
and before saving last values...
all of "versions.0.content." values move to "versions.1.content."
all of "versions.1.content." values move to "versions.2.content."
all of "versions.2.content." values move to "versions.3.content."
...
and so on
I need to get the average value of each parameter for the last year grouped by chairtype
1 document for example ("Department of Organic Chemistry"):
{
"_id": ObjectId("52b85dfa32b6249513f15897"),
"atkswlntfd": 0,
"auwbsjqzir": 0,
"avqrnjzbgd": 0,
"awquatbduv": 0,
"axdducvoxb": 2.46,
"bkoldugcrp": 4,
"bzccjslewi": 0,
"cclwyezydc": 0,
"chairtype": "E",
"confirmed": "1",
"covfctuuhi": 0,
"dingrnyknr": 0,
"dkfknpzsnt": 0,
"dqetuhllse": 0,
"duorlxiqbw": 5,
"eayoicezsh": 20,
"esrfffruoy": 0,
"ewdunlkxue": 1,
"ewfshjnome": 0,
"exakqiudxg": 5,
"fabdcybqxu": 0,
"fsplxunmaf": 0,
"fubxmogyam": 1,
"fuzqrnwsks": 3,
"fwtweaeeba": 52.31,
"fybnnlojgb": 5,
"gdjheqrqcx": 0,
"gpupstzwjd": 6,
"gxilphzzcu": 0,
"hbahrruokf": 0,
"hbqnleclwp": 2,
"hchpoxxnwz": 0,
"hmorfnbfvf": 0,
"hqatnzynxb": 0,
"hrqssioxdv": 0,
"hvscavwupe": 0,
"hyzlbtnxil": 0,
"idzxqjoxgd": 0,
"ikxsvguboy": 0,
"ipjpwkbqnt": 0,
"izqighabwk": 9000000,
"jncncbplme": 3,
"jxkspszlrc": 1,
"kekarveuhb": 0,
"klyoglzriu": 0,
"kmvuelmdwe": 0,
"knxzfjwnax": 5,
"kqfhjboecc": 0,
"kqhojbwvmo": 0,
"lchogmhynm": 0,
"lmuwyeqvph": 7,
"lvcdbhisbx": 0,
"mijczjeqeo": 8,
"mpxzquzcat": 0,
"mqqoetqued": 0,
"muktdrzphw": 0,
"nceszojuvt": 0,
"nypnjqgxop": 1,
"ojklibfieg": 2,
"padotysmxb": 0,
"parent": "47de3176-bbc3-44e0-8063-8920ac56fdc8",
"pidwyruvfq": 35.08,
"pkeymzxsrj": 0,
"pnjtfvzwiv": 1,
"pqjnpoxmcx": 0,
"pyexnkjujx": 38,
"qfeqdvzssg": 0,
"qidslfqnwn": 0,
"qvjszkahdc": 0,
"qzoriqedoh": 0,
"rjicuyfsmt": 0,
"rqenalbuko": 40,
"rxkwogbxwu": 0,
"sbqqabqukn": 1,
"skhgbmucrp": 0,
"slewjrvgjn": 0,
"tidjarsatz": 0,
"title_ru": "Кафедра органической химии",
"tmbagkmlgb": 0,
"type": "chair",
"uploaded": "1",
"uqcdessbeu": 0,
"url": "http:\/\/www.herzen.spb.ru\/main\/structure\/fukultets\/him\/1208434887\/",
"uuid": "a0a39ace-694c-48c5-841d-8b351e5b91da",
"vacoxpronz": 0,
"vdjfydjrpa": 13,
"versions": {
"0": {
"_id": ObjectId("52dbbc4cfb0a29ce4a8b45bd"),
"content": {
"atkswlntfd": 0,
"auwbsjqzir": 0,
"avqrnjzbgd": 0,
"awquatbduv": 0,
"axdducvoxb": 3,
"bkoldugcrp": 4,
"bzccjslewi": 0,
"cclwyezydc": 0,
"confirmed": null,
"covfctuuhi": 0,
"dingrnyknr": 0,
"dkfknpzsnt": 0,
"dqetuhllse": 2,
"duorlxiqbw": 5,
"eayoicezsh": 20,
"esrfffruoy": 0,
"ewdunlkxue": 3,
"ewfshjnome": 0,
"exakqiudxg": 5,
"fabdcybqxu": 1,
"fsplxunmaf": 0,
"fubxmogyam": 1,
"fuzqrnwsks": 0,
"fwtweaeeba": 55,
"fybnnlojgb": 0,
"gdjheqrqcx": 0,
"gpupstzwjd": 6,
"gxilphzzcu": 0,
"hbahrruokf": 0,
"hbqnleclwp": 3,
"hchpoxxnwz": 1849020,
"hmorfnbfvf": 2,
"hqatnzynxb": 0,
"hrqssioxdv": 0,
"hvscavwupe": 0,
"hyzlbtnxil": 0,
"idzxqjoxgd": 2,
"ikxsvguboy": 1,
"ipjpwkbqnt": 0,
"izqighabwk": 1040000,
"jncncbplme": 1,
"jxkspszlrc": 1,
"kekarveuhb": 0,
"klyoglzriu": 1,
"kmvuelmdwe": 0,
"knxzfjwnax": 5,
"kqfhjboecc": 0,
"kqhojbwvmo": 0,
"lchogmhynm": 2,
"lmuwyeqvph": 7,
"lvcdbhisbx": 0,
"mijczjeqeo": 8,
"mpxzquzcat": 0,
"mqqoetqued": 1,
"muktdrzphw": 0,
"nceszojuvt": 0,
"nypnjqgxop": 11,
"ojklibfieg": 0,
"padotysmxb": 0,
"pidwyruvfq": 34,
"pkeymzxsrj": 0,
"pnjtfvzwiv": 0,
"pqjnpoxmcx": 0,
"pyexnkjujx": 38,
"qfeqdvzssg": 0,
"qidslfqnwn": 0,
"qvjszkahdc": 0,
"qzoriqedoh": 0,
"rjicuyfsmt": 0,
"rqenalbuko": 40,
"rxkwogbxwu": 0,
"sbqqabqukn": 1,
"skhgbmucrp": 0,
"slewjrvgjn": 0,
"tidjarsatz": 0,
"tmbagkmlgb": 1,
"uqcdessbeu": 0,
"vacoxpronz": 0,
"vdjfydjrpa": 11,
"vktxndqyhm": 0,
"vmfqvfjptu": 0,
"vofeebpgsc": 5,
"wewmtafjvk": 1,
"wfqdcsrltv": 0,
"wzmbxalguv": 0,
"xjllpdyool": 0,
"xjxbwynytx": 0,
"xmirihwycl": 0,
"xxrsnjlmfv": 0,
"ybgdjpexth": 0,
"ymkmkuxlrq": 0,
"yneoycjloj": 0,
"yogujlfvpb": 0,
"zahigfmqxb": 0,
"znqqhqkjte": 0,
"zyztudtziu": 3
},
"content_hash": "816090f397962f92f5329fa5bb0a9ec1",
"datetime": ISODate("2014-01-19T11:51:40.590Z"),
"description_ru": "Значение показателей за этап 1",
"label_ru": "Окончание этапа 1"
},
"1": {
"_id": ObjectId("5305372cfb0a2944638b45bc"),
"content": {
"atkswlntfd": 0,
"auwbsjqzir": 0,
"avqrnjzbgd": 1,
"awquatbduv": 0,
"axdducvoxb": 2.46,
"bkoldugcrp": 4,
"bzccjslewi": 1,
"cclwyezydc": 0,
"confirmed": "1",
"covfctuuhi": 0,
"dingrnyknr": 0,
"dkfknpzsnt": 0,
"dqetuhllse": 0,
"duorlxiqbw": 5,
"eayoicezsh": 20,
"esrfffruoy": 0,
"ewdunlkxue": 0,
"ewfshjnome": 0,
"exakqiudxg": 5,
"fabdcybqxu": 1,
"fsplxunmaf": 0,
"fubxmogyam": 1,
"fuzqrnwsks": 0,
"fwtweaeeba": 52.31,
"fybnnlojgb": 0,
"gdjheqrqcx": 0,
"gpupstzwjd": 6,
"gxilphzzcu": 0,
"hbahrruokf": 0,
"hbqnleclwp": 0,
"hchpoxxnwz": 0,
"hmorfnbfvf": 0,
"hqatnzynxb": 0,
"hrqssioxdv": 0,
"hvscavwupe": 0,
"hyzlbtnxil": 0,
"idzxqjoxgd": 0,
"ikxsvguboy": 0,
"ipjpwkbqnt": 0,
"izqighabwk": 0,
"jncncbplme": 0,
"jxkspszlrc": 1,
"kekarveuhb": 1,
"klyoglzriu": 0,
"kmvuelmdwe": 0,
"knxzfjwnax": 5,
"kqfhjboecc": 0,
"kqhojbwvmo": 0,
"lchogmhynm": 0,
"lmuwyeqvph": 7,
"lvcdbhisbx": 0,
"mijczjeqeo": 8,
"mpxzquzcat": 0,
"mqqoetqued": 0,
"muktdrzphw": 0,
"nceszojuvt": 0,
"nypnjqgxop": 0,
"ojklibfieg": 1,
"padotysmxb": 0,
"pidwyruvfq": 34.15,
"pkeymzxsrj": 0,
"pnjtfvzwiv": 0,
"pqjnpoxmcx": 0,
"pyexnkjujx": 38,
"qfeqdvzssg": 0,
"qidslfqnwn": 0,
"qvjszkahdc": 0,
"qzoriqedoh": 0,
"rjicuyfsmt": 0,
"rqenalbuko": 40,
"rxkwogbxwu": 0,
"sbqqabqukn": 1,
"skhgbmucrp": 0,
"slewjrvgjn": 0,
"tidjarsatz": 0,
"tmbagkmlgb": 0,
"uqcdessbeu": 0,
"vacoxpronz": 0,
"vdjfydjrpa": 11,
"visited": null,
"vktxndqyhm": 0,
"vmfqvfjptu": 0,
"vofeebpgsc": 4.77,
"wewmtafjvk": 0,
"wfqdcsrltv": 0,
"wzmbxalguv": 0,
"xjllpdyool": 0,
"xjxbwynytx": 0,
"xmirihwycl": 0,
"xxrsnjlmfv": 0,
"ybgdjpexth": 0,
"ymkmkuxlrq": 0,
"yneoycjloj": 0,
"yogujlfvpb": 0,
"zahigfmqxb": 0,
"znqqhqkjte": 0,
"zyztudtziu": 3.23
},
"content_hash": "d273fb095a7c08fef69fb90ec316fcb9",
"datetime": ISODate("2014-02-19T22:58:52.805Z"),
"description_ru": "Значение показателей за этап 2",
"label_ru": "Окончание этапа 2"
},
"2": {
"_id": ObjectId("532854a3fb0a2973718b45c6"),
"content": {
"atkswlntfd": 0,
"auwbsjqzir": 0,
"avqrnjzbgd": 2,
"awquatbduv": 0,
"axdducvoxb": 2.46,
"bkoldugcrp": 4,
"bzccjslewi": 0,
"cclwyezydc": 0,
"confirmed": "1",
"covfctuuhi": 0,
"dingrnyknr": 0,
"dkfknpzsnt": 0,
"dqetuhllse": 0,
"duorlxiqbw": 5,
"eayoicezsh": 20,
"esrfffruoy": 0,
"ewdunlkxue": 1,
"ewfshjnome": 0,
"exakqiudxg": 5,
"fabdcybqxu": 1,
"fsplxunmaf": 0,
"fubxmogyam": 1,
"fuzqrnwsks": 0,
"fwtweaeeba": 52.15,
"fybnnlojgb": 5,
"gdjheqrqcx": 0,
"gpupstzwjd": 6,
"gxilphzzcu": 0,
"hbahrruokf": 0,
"hbqnleclwp": 2,
"hchpoxxnwz": 0,
"hmorfnbfvf": 0,
"hqatnzynxb": 0,
"hrqssioxdv": 0,
"hvscavwupe": 0,
"hyzlbtnxil": 0,
"idzxqjoxgd": 0,
"ikxsvguboy": 0,
"ipjpwkbqnt": 0,
"izqighabwk": 0,
"jncncbplme": 0,
"jxkspszlrc": 1,
"kekarveuhb": 0,
"klyoglzriu": 0,
"kmvuelmdwe": 0,
"knxzfjwnax": 5,
"kqfhjboecc": 0,
"kqhojbwvmo": 0,
"lchogmhynm": 0,
"lmuwyeqvph": 7,
"lvcdbhisbx": 0,
"mijczjeqeo": 8,
"mpxzquzcat": 0,
"mqqoetqued": 0,
"muktdrzphw": 0,
"nceszojuvt": 0,
"nypnjqgxop": 0,
"ojklibfieg": 1,
"padotysmxb": 0,
"pidwyruvfq": 34.62,
"pkeymzxsrj": 0,
"pnjtfvzwiv": 0,
"pqjnpoxmcx": 0,
"pyexnkjujx": 38,
"qfeqdvzssg": 0,
"qidslfqnwn": 0,
"qvjszkahdc": 0,
"qzoriqedoh": 0,
"rjicuyfsmt": 2,
"rqenalbuko": 40,
"rxkwogbxwu": 0,
"sbqqabqukn": 1,
"skhgbmucrp": 0,
"slewjrvgjn": 0,
"tidjarsatz": 0,
"tmbagkmlgb": 0,
"uploaded": null,
"uqcdessbeu": 0,
"vacoxpronz": 0,
"vdjfydjrpa": 11,
"visited": true,
"vktxndqyhm": 0,
"vmfqvfjptu": 0,
"vofeebpgsc": 4.77,
"wewmtafjvk": 0,
"wfqdcsrltv": 0,
"wzmbxalguv": 0,
"xjllpdyool": 1,
"xjxbwynytx": 0,
"xmirihwycl": 0,
"xxrsnjlmfv": 0,
"ybgdjpexth": 0,
"ymkmkuxlrq": 0,
"yneoycjloj": 2,
"yogujlfvpb": 0,
"zahigfmqxb": 0,
"znqqhqkjte": 0,
"zyztudtziu": 3.23
},
"content_hash": "64adcf5534b5b1f77282a95f0b14ef99",
"datetime": ISODate("2014-03-18T14:13:55.593Z"),
"description_ru": "Значение показателей за этап 3",
"document_id": "52b85dfa32b6249513f15897",
"document_uuid": "a0a39ace-694c-48c5-841d-8b351e5b91da",
"label_ru": "Окончание этапа 3"
}
},
"visited": true,
"vktxndqyhm": 0,
"vmfqvfjptu": 0,
"vofeebpgsc": 4.77,
"wewmtafjvk": 1,
"wfqdcsrltv": 0,
"wzmbxalguv": 0,
"xjllpdyool": 1,
"xjxbwynytx": 0,
"xmirihwycl": 0,
"xxrsnjlmfv": 0,
"ybgdjpexth": 0,
"ymkmkuxlrq": 0,
"yneoycjloj": 0,
"yogujlfvpb": 0,
"zahigfmqxb": 0,
"znqqhqkjte": 0,
"zyztudtziu": 3.23
}
Now earliest array with history of data is "versions.2.", but 2 weeks later it will be "versions.3." and 6 weeks later it will be "versions.4." and so on...
**this is average of "versions.0.vofeebpgsc" values grouped by "chairtype":**
array(2) {
["result"]=>
array(3) {
[0]=>
array(2) {
["_id"]=>
string(1) "E"
["MID"]=>
float(1.3903333333333)
}
[1]=>
array(2) {
["_id"]=>
string(1) "T"
["MID"]=>
float(0.4)
}
[2]=>
array(2) {
["_id"]=>
string(1) "G"
["MID"]=>
float(0.72931034482759)
}
}
["ok"]=>
float(1)
}
function getMiddle($itemName,$chairType){
//return average of "versions.0.$itemName" value for "chairtype" = $chairType
switch ($chairType){
case 'E':
$chairType = 0;
break;
case 'T':
$chairType = 1;
break;
case 'G':
$chairType = 2;
break;
}
$m = new MongoClient();
$db = $m->foo_data;
$collection = new MongoCollection($db, 'documents');
$thisField = '$versions.content.'.$itemName;
$out = $collection->aggregate(
array('$match' => array('type' => 'chair')
),
array('$unwind' => '$versions'),
array('$group' => array( '_id' => '$_id',
'chairtype' => array('$first' =>'$chairtype'),
'versions' => array('$first' => '$versions')
)),
array('$group'=> array( '_id'=>'$chairtype',
'MID'=> array('$avg'=> $thisField)
))
);
return round ($out['result'][$chairType]['MID'],2);
}
echo getMiddle('vofeebpgsc','G'); //I use it in foreach cycle and send different input values
I need to get average value for each parameter between "versions.0.param_name" and "versions.11.param_name" in every document grouped by "chairtype" (it will be average from parameter history for last year for each type of university department)
I got this task because the average value of "versions.0.param_name" is not very good reflects the statistics.
for example... I have 60 documents with "chairtype" = "E" and now I have '0','1' and '2' arrays of history in versions
I need to calculate:
(
"versions.0.content.fwtweaeeba" +
"versions.1.content.fwtweaeeba" +
"versions.2.content.fwtweaeeba" +
the same fields for each of 59 documents
) / (60*3) = It is good average of "fwtweaeeba" parameter for "chairtype" = "E"
9 months later I will have 60 documents with "chairtype" = "E" and I will have '0','1','2','3','4','5','6','7',8','9','10','11', arrays of history in versions
I will need to calculate:
(
"versions.0.content.fwtweaeeba" +
"versions.1.content.fwtweaeeba" +
"versions.2.content.fwtweaeeba" +
"versions.3.content.fwtweaeeba" +
"versions.4.content.fwtweaeeba" +
"versions.5.content.fwtweaeeba" +
"versions.6.content.fwtweaeeba" +
"versions.7.content.fwtweaeeba" +
"versions.8.content.fwtweaeeba" +
"versions.9.content.fwtweaeeba" +
"versions.10.content.fwtweaeeba" +
"versions.11.content.fwtweaeeba" +
the same fields for each of 59 documents
) / (60*12) = It will be good average of "fwtweaeeba" parameter for "chairtype" = "E"
and so on for each "chairtype"
Can I do it with mongo db aggregation framework?
How can I do it?
Сan anyone suggest a good HOWTO about compiling difficult aggregation queries in MongoDB?
The data structure here is not a good implementation, there are lots of problems with how this is structured and it is completely unsuited to aggregation. The main problems here are:
Your structure does not actually use any arrays, right now it does not
All of the specific key names case a real problem, and this can be avoided.
As such the only way to traverse this sort of structure is using JavaScript with mapReduce.
Defining a mapper:
var mapper = function () {
for ( var n in this.versions ) {
for ( var k in this.versions[n].content ) {
if (
( k != 'confirmed' ) ||
( k != 'visited' ) )
emit(
{
type: this.chairtype,
key: k
},
this.versions[n].content[k]
);
}
}
};
So what this is doing is cycling through each of the versions entries and then also through everything on content. The key is emitted for each of the content keys you want as well as by the "chairtype" key. And the value is that matching value.
And then a reducer:
var reducer = function (key,values) {
return ( Array.sum( values ) != 0 )
? Array.sum( values ) / values.length : 0;
};
Which is just a simple way of producing a an average from all the values coming in for the mapper with the same key.
So while that should work nicely, what you should be doing is changing your structure. So in fact if you had something like this:
{
"_id": ObjectId("52b85dfa32b6249513f15897"),
"parent": "47de3176-bbc3-44e0-8063-8920ac56fdc8",
"type": "chair",
"chairtype": "E",
"content": [
{ "key": "atkswlntfd", "value": 0, "version": 0 },
{ "key": "auwbsjqzir", "value": 0, "version": 0 },
{ "key": "avqrnjzbgd", "value": 0, "version": 0 }
]
}
Or generally more or less in that form, the the aggregation operation becomes very simple:
db.collection.aggregate([
{ "$unwind": "$content" },
{ "$group": {
"_id": {
"chairtype": "$chairtype",
"key": "$content.key"
},
"average": { "$avg": "$content.value" }
}}
])
Or whatever other variation of this is required, but now it is made possible by changing the structure.
So without the document being structured differently you will need to use mapReduce to do this.

Categories