javascript - I'm trying to import Excel to Mongodb from Meteor, How can I get every _id to my documents? -
for each document in mongodb should have _id, i'm trying import excel mongodb meteor. has 1 _id, result looks beautiful it's not expect, please me solve this.
my code:
import { template } 'meteor/templating'; import { reactivevar } 'meteor/reactive-var'; import { excels } '../imports/api/excels.js'; import './main.html'; const xlsx = require('xlsx'); template.read.events({ 'change input' (evt, instance) { /* "browser file upload form element" sheetjs readme */ const file = evt.currenttarget.files[0]; const reader = new filereader(); reader.onload = function(e) { const data = e.target.result; const name = file.name; /* meteor magic */ meteor.call('upload', data, name, function(err, wb) { if(err) console.error(err); else { /* here -- dumps array of arrays console */ console.log(xlsx.utils.sheet_to_json(wb.sheets[wb.sheetnames[0]], {header:1})); document.getelementbyid('out').innerhtml = json.stringify(xlsx.utils.sheet_to_json(wb.sheets[wb.sheetnames[0]]),2,2); excels.insert({ "spreadsheet": xlsx.utils.sheet_to_json(wb.sheets[wb.sheetnames[0]]) }); } }); }; reader.readasbinarystring(file); }, });
and result:
meteor:primary> db.excels.find() { "_id" : "pc3nxfpgutdwe4psf", "spreadsheet" : [ { *** information here ***
expected result:
meteor:primary> db.excels.find() { { "_id" : "pc3nxfpgutdwe4psf", "first" : "first" }, { "_id" : "pc3nxfpgutdwe4psg", "second" : "second" }, .....
server/main.js
import { meteor } 'meteor/meteor'; import '../imports/api/excels.js'; const xlsx = require('xlsx'); meteor.methods({ upload: (bstr, name) => { /* read data , return workbook object frontend */ return xlsx.read(bstr, {type:'binary'}); }, download: () => { /* generate workbook object , return frontend */ const data = [ ["a", "b", "c"], [ 1 , 2 , 3 ] ]; const ws = xlsx.utils.aoa_to_sheet(data); const wb = {sheetnames: ["sheet1"], sheets:{sheet1:ws }}; return wb; } }); meteor.startup(() => { });
imports/api/excels.js
import { mongo } 'meteor/mongo'; export const excels = new mongo.collection('excels');
mongodb collection:
{ "_id" : "bhvkswwqfrjhcwyc2", "spreadsheet" : [ { "line number" : "1", "item name" : "ms425-32-hw", "description" : "meraki ms425-32 l3 cld-mngd 32x 10g sfp+ switch", "quantity" : "2", "installed" : "2", "spare" : "0" }, { "line number" : "2", "item name" : "ms225-48-hw", "description" : "meraki ms225-48 l2 stck cld-mngd 48x gige switch", "quantity" : "2", "installed" : "2", "spare" : "0" }, { "line number" : "3", "item name" : "ms225-48fp-hw", "description" : "meraki ms225-48fp l2 stck cld-mngd 48x gige 740w poe switch", "quantity" : "14", "installed" : "12", "spare" : "2" }, { "line number" : "4", "item name" : "mr72-hw", "description" : "meraki mr72 cloud managed ap", "quantity" : "14", "installed" : "13", "spare" : "1" }, { "line number" : "4.1", "item name" : "ma-ant-20", "description" : "meraki dual band omni antennas", "quantity" : "56", "installed" : "52", "spare" : "4" }, { "line number" : "5", "item name" : "mr33-hw", "description" : "meraki mr33 cloud managed ap", "quantity" : "20", "installed" : "18", "spare" : "2" }, { "line number" : "6", "item name" : "mx400-hw", "description" : "meraki mx400 cloud managed security appliance", "quantity" : "2", "installed" : "2", "spare" : "0" }, { "line number" : "7", "item name" : "n3k-c3524p-10gx", "description" : "nexus 3524x, 24 10g ports", "quantity" : "2", "installed" : "2", "spare" : "0" }, { "line number" : "8", "item name" : "ma-sfp-10gb-lrm", "description" : "meraki 10g base lrm", "quantity" : "56", "installed" : "48", "spare" : "8" }, { "line number" : "9", "item name" : "ma-sfp-10gb-sr", "description" : "meraki 10g base sr multi-mode", "quantity" : "16", "installed" : "16", "spare" : "0" }, { "line number" : "10", "item name" : "sfp-10g-sr=", "description" : "10gbase-sr sfp module", "quantity" : "8", "installed" : "8", "spare" : "0" } ] }
document.getelementbyid('out').innerhtml = json.stringify(xlsx.utils.sheet_to_json(wb.sheets[wb.sheetnames[0]]),2,2);
[ { "line number": "1", "item name": "ms425-32-hw", "description": "meraki ms425-32 l3 cld-mngd 32x 10g sfp+ switch", "quantity": "2", "installed": "2", "spare": "0" }, { "line number": "2", "item name": "ms225-48-hw", "description": "meraki ms225-48 l2 stck cld-mngd 48x gige switch", "quantity": "2", "installed": "2", "spare": "0" }, { "line number": "3", "item name": "ms225-48fp-hw", "description": "meraki ms225-48fp l2 stck cld-mngd 48x gige 740w poe switch", "quantity": "14", "installed": "12", "spare": "2" }, .... ]
you inserting array collection key
spreadsheet
on line:
excels.insert({ "spreadsheet": xlsx.utils.sheet_to_json(wb.sheets[wb.sheetnames[0]]) });
this why see key spreadsheet
:
{ "_id" : "bhvkswwqfrjhcwyc2", "spreadsheet" : ...
but take want insert every element of array own document, every row of spreadsheet produce own id. you'd remove spreadsheet
, insert array whole:
excels.insert(xlsx.utils.sheet_to_json(wb.sheets[wb.sheetnames[0]]))
however, [1, 2], seems meteor not support inserting array root document, therefore must loop through each row , insert them individually:
xlsx.utils.sheet_to_json(wb.sheets[wb.sheetnames[0]]).foreach(r => excels.insert(r));
Comments
Post a Comment