| 
									
										
										
										
											2023-02-24 07:46:48 +00:00
										 |  |  | --- | 
					
						
							|  |  |  | title: MongoDB | 
					
						
							| 
									
										
										
										
											2023-02-28 11:40:44 +00:00
										 |  |  | pagination_prev: demos/desktop/index | 
					
						
							|  |  |  | pagination_next: demos/local/index | 
					
						
							| 
									
										
										
										
											2023-02-24 07:46:48 +00:00
										 |  |  | sidebar_custom_props: | 
					
						
							|  |  |  |   type: document | 
					
						
							|  |  |  | --- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-27 09:12:19 +00:00
										 |  |  | import current from '/version.js'; | 
					
						
							| 
									
										
										
										
											2023-04-29 11:21:37 +00:00
										 |  |  | import CodeBlock from '@theme/CodeBlock'; | 
					
						
							| 
									
										
										
										
											2023-04-27 09:12:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 07:46:48 +00:00
										 |  |  | MongoDB is a popular document-oriented database engine. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | It is straightforward to treat collections as worksheets.  Each object maps to | 
					
						
							|  |  |  | a row in the table. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Integration Details
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The official NodeJS connector is `mongodb`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### Importing Data
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Data stored in an array of objects can be added to MongoDB Collections using | 
					
						
							|  |  |  | `Collection#insertMany`.  `sheet_to_json` can generate data from worksheets: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* import data from a worksheet to a collection */ | 
					
						
							|  |  |  | const aoo = XLSX.utils.sheet_to_json(ws); | 
					
						
							|  |  |  | await collection.insertMany(aoo, {ordered: true}); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | #### Exporting Data
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `Collection#find` can pull an array of objects from a Mongo Collection. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Normally the method adds a `_id` field to each object.  The recommended way to | 
					
						
							|  |  |  | remove the field is to use a `projection` to suppress the ID: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* generate an array of objects from a collection */ | 
					
						
							|  |  |  | const aoo = await collection.find({}, {projection:{_id:0}}).toArray(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* generate a worksheet from a collection */ | 
					
						
							|  |  |  | const ws = utils.json_to_sheet(aoo); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Complete Example
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :::note | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This demo was last tested on 2023 February 23 with MongoDB CE 6.0.4, MongoDB | 
					
						
							|  |  |  | connector module 5.1.0 and NodeJS 18.14.2. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 0) Install MongoDB 6.0 Community Edition. The macOS steps required `brew`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | brew tap mongodb/brew | 
					
						
							|  |  |  | brew update | 
					
						
							|  |  |  | brew install mongodb-community@6.0 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1) Start a MongoDB server on `localhost` (follow official instructions). To run | 
					
						
							|  |  |  | in the foreground on Intel MacOS: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | /usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 2) Create base project and install the dependencies: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-29 11:21:37 +00:00
										 |  |  | <CodeBlock language="bash">{`\ | 
					
						
							| 
									
										
										
										
											2023-02-24 07:46:48 +00:00
										 |  |  | mkdir sheetjs-mongo | 
					
						
							|  |  |  | cd sheetjs-mongo | 
					
						
							|  |  |  | npm init -y | 
					
						
							| 
									
										
										
										
											2023-04-29 11:21:37 +00:00
										 |  |  | npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz mongodb@5.1.0`} | 
					
						
							|  |  |  | </CodeBlock> | 
					
						
							| 
									
										
										
										
											2023-02-24 07:46:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 3) Save the following to `SheetJSMongoCRUD.mjs` (the key step is highlighted): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js title="SheetJSMongoCRUD.mjs" | 
					
						
							|  |  |  | import { writeFile, set_fs, utils } from 'xlsx'; | 
					
						
							|  |  |  | import * as fs from 'fs'; set_fs(fs); | 
					
						
							|  |  |  | import { MongoClient } from 'mongodb'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const url = 'mongodb://localhost:27017/sheetjs'; | 
					
						
							|  |  |  | const db_name = 'sheetjs'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Connect to mongodb server */ | 
					
						
							|  |  |  | const client = await MongoClient.connect(url, { useUnifiedTopology: true }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Sample data table */ | 
					
						
							|  |  |  | const db = client.db(db_name); | 
					
						
							|  |  |  | try { await db.collection('pres').drop(); } catch(e) {} | 
					
						
							|  |  |  | const pres = db.collection('pres'); | 
					
						
							|  |  |  | await pres.insertMany([ | 
					
						
							|  |  |  |   { name: "Barack Obama", idx: 44 }, | 
					
						
							|  |  |  |   { name: "Donald Trump", idx: 45 }, | 
					
						
							|  |  |  |   { name: "Joseph Biden", idx: 46 } | 
					
						
							|  |  |  | ], {ordered: true}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // highlight-start | 
					
						
							|  |  |  | /* Create worksheet from collection */ | 
					
						
							|  |  |  | const aoo = await pres.find({}, {projection:{_id:0}}).toArray(); | 
					
						
							|  |  |  | const ws = utils.json_to_sheet(aoo); | 
					
						
							|  |  |  | // highlight-end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Export to XLSX */ | 
					
						
							|  |  |  | const wb = utils.book_new(); | 
					
						
							|  |  |  | utils.book_append_sheet(wb, ws, "Presidents"); | 
					
						
							|  |  |  | writeFile(wb, "SheetJSMongoCRUD.xlsx"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Close connection */ | 
					
						
							|  |  |  | client.close(); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This script: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - connects to the local MongoDB server using database `sheetjs` | 
					
						
							|  |  |  | - removes the `pres` collection if it already exists | 
					
						
							|  |  |  | - creates a new collection `pres` with sample data | 
					
						
							|  |  |  | - creates a SheetJS worksheet from the collection (highlighted in the snippet) | 
					
						
							|  |  |  | - creates a SheetJS workbook, adds the worksheet, and exports to XLSX | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 4) Run `node SheetJSMongoCRUD.mjs` and open `SheetJSMongoCRUD.xlsx` |