Skip to content

Commit

Permalink
Вывод показателей по регионам в списке администрирования. Количество …
Browse files Browse the repository at this point in the history
…регионов и количество вершин по уровням и общее
  • Loading branch information
klimashkin committed Dec 27, 2013
1 parent 31398a1 commit 19675f7
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 5 deletions.
75 changes: 70 additions & 5 deletions controllers/region.js
Original file line number Diff line number Diff line change
Expand Up @@ -897,6 +897,50 @@ function getParentsAndChilds(region, cb) {
}


//Массив количества всех регионов по уровням
function getRegionsCountByLevel(cb) {
step(
function () {
for (var i = 0; i < maxRegionLevel; i++) {
Region.count({parents: {$size: i}}, this.parallel());
}
},
function (err/*, childCounts*/) {
if (err) {
return cb({message: err.message, error: true});
}
var childLenArr = [],
i;

for (i = 1; i < arguments.length; i++) {
if (arguments[i]) {
childLenArr.push(arguments[i]);
}
}
cb(null, childLenArr);
}
);
}
//Статистика регионов по уровням (количество регионов, количество их точек)
function getRegionsStatByLevel(cb) {
step(
function () {
Region.collection.aggregate([
{$project: {_id: 0, level: {$size: '$parents'}, pointsnum: 1}}, //Поля для выборки. level - формируемое поле размера массива родительских, т.е. уровень. Появилось в 2.5.3 https://jira.mongodb.org/browse/SERVER-4899
{$group: {_id: '$level', regionsCount: {$sum: 1}, pointsCount: {$sum: '$pointsnum'}}}, //Считаем показатели по каждому уровню
{$sort: {_id: 1}}, //Сортируем по родительский по возрастанию
{$project: {regionsCount: 1, pointsCount: 1, _id: 0}} //Оставляем только нужные поля
], this);
},
function (err, regionsStat) {
if (err) {
return cb({message: err.message, error: true});
}
cb(null, regionsStat);
}
);
}

function getRegionsFull(socket, data, cb) {
var iAm = socket.handshake.session.user;

Expand All @@ -908,12 +952,33 @@ function getRegionsFull(socket, data, cb) {
return cb({message: 'Bad params', error: true});
}

Region.find({}, {_id: 0, geo: 0, __v: 0}, {lean: true}, function (err, regions) {
if (err || !regions) {
return cb({message: err && err.message || 'No regions', error: true});
step(
function () {
Region.find({}, {_id: 0, geo: 0, __v: 0}, {lean: true}, this.parallel());
getRegionsStatByLevel(this.parallel());
},
function (err, regions, regionsStatByLevel) {
if (err || !regions) {
return cb({message: err && err.message || 'No regions', error: true});
}
var regionsStatCommon = {regionsCount: 0, pointsCount: 0},
i;

//Общие показатели (сложенные по уровням)
for (i = regionsStatByLevel.length; i--;) {
regionsStatCommon.regionsCount += regionsStatByLevel[i].regionsCount;
regionsStatCommon.pointsCount += regionsStatByLevel[i].pointsCount;
}

cb({
regions: regions,
stat: {
common: regionsStatCommon,
byLevel: regionsStatByLevel
}
});
}
cb({regions: regions});
});
);
}

function getRegionsPublic(socket, data, cb) {
Expand Down
27 changes: 27 additions & 0 deletions importingDB.txt
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,33 @@ sudo node app.js --land prod --domain pastvu.com --port 80 --uport 3001
Выгрузить csv определенные поля по запросу
mongoexport -d pastvu -c users --csv --fields login,birthdate,sex --query '{"$and":[{"$or":[{"pcount":{"$gt":0}},{"ccount":{"$gt":0}}]},{"$or":[{"birthdate":{"$nin":[null,"1.1.1920"]}},{"sex":{"$ne":null}}]}]}' --out mdump/users.csv

/*Подсчет количества точек по уровням в mongodb 2.2-2.4*/
//Считаем количество регионов и точек первого(нулевого) уровня
//Его надо считать отдельно, так как в следущем агрегаторе $unwind "раскроет" только те, у кого массив parents не пуст
Region.collection.aggregate([
{$project: {_id: 0, parents: 1, pointsnum: 1}},
{$match: {parents: {$size: 0}}},
{$group: {_id: null, total: {$sum: '$pointsnum'}}}
], this.parallel());
//Считаем количество регионов и точек последующих уровней
Region.collection.aggregate([
{$project: {_id: 0, cid: 1, parents: 1, pointsnum: 1}},
{$unwind: '$parents'}, //"Раскрываем" массив родителей по каждому региону, т.е. будет несколько строк одного региона по количеству его родителей
{$group: {_id: '$cid', size: {$sum: 1}, pointsum: {$sum: '$pointsnum'}}}, //Считаем количество каждого раскрытого региона, таки образом получив количество родительских. Также складываем кол-во точек
{$project: {size: 1, realpointsum: {$divide: ['$pointsum', '$size']}}}, //Делим количество точек на количество родительских, получая реального кол-во точек региона
{$group: {_id: '$size', regionscount: {$sum: 1}, totalpointsum: {$sum: '$realpointsum'}}}, //Складываем количество точек по каждому количеству родительских (уровню)
{$project: {size: '$_id', regionscount: 1, totalpointsum: 1, _id: 0}}, //Переименовываем поля в более читаемые
{$sort: {size: 1}}
], this.parallel());

/*Подсчет количества точек по уровням в mongodb 2.6*/
Region.collection.aggregate([
{$project: {_id: 0, level: {$size: '$parents'}, pointsnum: 1}},
{$group: {_id: '$level', regionscount: {$sum: 1}, pointscount: {$sum: '$pointsnum'}}},
{$sort: {_id: 1}}, //Сортируем по родительский по возрастанию
{$project: {regionscount: 1, pointscount: 1, _id: 0}}
], this);

ПЕРЕНОС ФАЙЛОВ
CMD скрипт по flatten всех файлов во всех подпапках в одну результирующую папку:
forfiles /s /m *.* /p \_test\pastvu\photosAll /c "cmd /c move @file \_test\pastvu\result"
Expand Down
2 changes: 2 additions & 0 deletions public/js/module/admin/regionList.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ define([
create: function () {
this.auth = globalVM.repository['m/common/auth'];
this.regions = ko.observableArray();
this.stat = null;

this.getRegions(function () {
ko.applyBindings(globalVM, this.$dom[0]);
Expand All @@ -35,6 +36,7 @@ define([
if (error) {
window.noty({text: data && data.message || 'Error occurred', type: 'error', layout: 'center', timeout: 4000, force: true});
} else {
this.stat = data.stat;
this.regions(this.treeBuild(data.regions));
this.regionsFlat = data.regions;
}
Expand Down
9 changes: 9 additions & 0 deletions public/style/admin/regionList.less
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@
.user-select(none);
}

.stat {
margin-bottom: 5px;

> .glyphicon {
color: #777;
font-size: @font-size-small;
}
}

.headElem {
position: relative;
display: inline-block;
Expand Down
21 changes: 21 additions & 0 deletions views/module/admin/regionList.jade
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
.adminRegions(data-bind="with: repository[M!M]")
h4 Список регионов
.regionsStat
.stat
span Всего регионов:
b(data-bind="text: ' '+stat.common.regionsCount")
span &nbsp;&nbsp;По уровням:
//ko foreach: stat.byLevel
//ko if: $index() > 0
span.glyphicon.glyphicon-play
// /ko
b(data-bind="text: ' ' + $data.regionsCount + ' '")
// /ko
.stat
span Всего вершин:
b(data-bind="text: ' '+stat.common.pointsCount")
span &nbsp;&nbsp;По уровням:
//ko foreach: stat.byLevel
//ko if: $index() > 0
span.glyphicon.glyphicon-play
// /ko
b(data-bind="text: ' ' + $data.pointsCount + ' '")
// /ko
.regionsHead
a.headElem.interact(href="/admin/region/create")
span.glyphicon.glyphicon-plus
Expand Down

0 comments on commit 19675f7

Please sign in to comment.