Skip to content

Instantly share code, notes, and snippets.

@omeroot
Last active December 23, 2015 12:45
Show Gist options
  • Select an option

  • Save omeroot/67791f9b315cd5f00510 to your computer and use it in GitHub Desktop.

Select an option

Save omeroot/67791f9b315cd5f00510 to your computer and use it in GitHub Desktop.
mongodb collection it contains multi language words(swear) and this util library export this collection to excel and stream to frontend
/*
* EXAMPLE MONGODB BLACKLIST DOCUMENT OBJECT
*
* {
* _id : <mongoId>,
* language: <which language this word>,
* word : <word>
* }
*
* DEPENDENCIES
*
* streamifier
* mongoose
* node-xlsx
*
node-xlsx data structure
[ [col1,col2,...] , [col1,col2,...] , [col1,col2,...] , [col1,col2,...] , [col1,col2,...] ]
↑ ↑ ↑ ↑ ↑
row1 row2 row3 row4 row5
example excel output
_____ ______ ______ _____ _____
| tr | en | ru | de | ar |
------------------------------- |
| piç | fuck | ... | ... | ... |
*/
var mongoose = require('mongoose');
var streamifier = require('streamifier');//buffer to stream utils
var xlsx = require('node-xlsx');//excel library
var BlackList = mongoose.model('BlackList');//blacklist mongoose model
BlackList.aggregate([
{
$group: {
'_id': {language: '$language'},
'word': {'$addToSet': '$word'},
'counter': {$sum: 1}
}
},
{
$sort: {'counter': 1}
}
], function (err, result) {
if (err) {
console.log('MONGO ERROR', err);
} else {
var maxSize = result[result.length - 1].counter;
var data = [[]];
var indexer = {};
for (var i = 0; i < result.length; i++) {
data[0][i] = result[i]._id.language;
indexer[result[i]._id.language] = i;
}
for (var j = 0; j < maxSize; j++) {
var row = [];
for (var k = 0; k < result.length; k++) {
var language = result[k]._id.language;
if (j + 1 <= result[k].word.length) {
row[parseInt(indexer[language])] = result[k].word[j];
}
}
data[j + 1] = row;
}
var buffer = xlsx.build([{name: new Date().getTime().toString(), data: data}]);
var size = buffer.length;
res.writeHead(200, {
'Content-Length': size,
'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
//stream excel to response
streamifier.createReadStream(buffer).pipe(res);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment