106 lines
2.7 KiB
Markdown
106 lines
2.7 KiB
Markdown
|
---
|
||
|
title: PouchDB
|
||
|
pagination_prev: demos/grid
|
||
|
pagination_next: demos/worker
|
||
|
sidebar_custom_props:
|
||
|
type: nosql
|
||
|
---
|
||
|
|
||
|
PouchDB is a pure JS database with built-in synchronization features.
|
||
|
|
||
|
## Integration Details
|
||
|
|
||
|
`Database#allDocs` is the standard approach for bulk data export. The generated
|
||
|
row objects have additional `_id` and `_rev` keys that should be removed.
|
||
|
|
||
|
Nested objects must be flattened. The ["Tutorial"](/docs/getting-started/example)
|
||
|
includes an example of constructing a simple array.
|
||
|
|
||
|
```js
|
||
|
function export_pouchdb_to_xlsx(db) {
|
||
|
/* fetch all rows, including the underlying data */
|
||
|
db.allDocs({include_docs: true}, function(err, doc) {
|
||
|
|
||
|
/* pull the individual data rows */
|
||
|
const aoo = doc.rows.map(r => {
|
||
|
/* `rest` will include every field from `r` except for _id and _rev */
|
||
|
const { _id, _rev, ...rest } = r;
|
||
|
return rest;
|
||
|
});
|
||
|
|
||
|
/* generate worksheet */
|
||
|
const ws = XLSX.utils.json_to_sheet(aoo);
|
||
|
|
||
|
/* generate workbook and export */
|
||
|
const wb = XLSX.utils.book_new();
|
||
|
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
|
||
|
XLSX.writeFile(wb, "SheetJSPouch.xlsx");
|
||
|
});
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Complete Example
|
||
|
|
||
|
0) Download the "Working Version" from the Getting Started guide.
|
||
|
|
||
|
The ZIP file should have `MD5` checksum `ac4da7cb0cade1be293ba222462f109c`:
|
||
|
|
||
|
```bash
|
||
|
curl -LO https://github.com/nickcolley/getting-started-todo/archive/master.zip
|
||
|
md5sum master.zip || md5 master.zip
|
||
|
### the checksum will be printed
|
||
|
```
|
||
|
|
||
|
If the download is unavailable, a mirror is available at
|
||
|
<https://docs.sheetjs.com/pouchdb/master.zip>
|
||
|
|
||
|
1) Unzip the `master.zip` file and enter the folder:
|
||
|
|
||
|
```bash
|
||
|
unzip master.zip
|
||
|
cd getting-started-todo-master
|
||
|
```
|
||
|
|
||
|
2) Edit `index.html` to reference the SheetJS library and add a button:
|
||
|
|
||
|
```html title="index.html"
|
||
|
<body>
|
||
|
<!-- highlight-start -->
|
||
|
<script src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"></script>
|
||
|
<button id="xport">Export!</button>
|
||
|
<!-- highlight-end -->
|
||
|
<section id="todoapp">
|
||
|
```
|
||
|
|
||
|
3) Just before the end of `app.js`, add a `click` event listener:
|
||
|
|
||
|
```js title="app.js"
|
||
|
if (remoteCouch) {
|
||
|
sync();
|
||
|
}
|
||
|
|
||
|
// highlight-start
|
||
|
document.getElementById("xport").addEventListener("click", function() {
|
||
|
db.allDocs({include_docs: true}, function(err, doc) {
|
||
|
const aoo = doc.rows.map(r => {
|
||
|
const { _id, _rev, ... rest } = r.doc;
|
||
|
return rest;
|
||
|
});
|
||
|
const ws = XLSX.utils.json_to_sheet(aoo);
|
||
|
const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
|
||
|
XLSX.writeFile(wb, "SheetJSPouch.xlsx");
|
||
|
});
|
||
|
});
|
||
|
// highlight-end
|
||
|
})();
|
||
|
```
|
||
|
|
||
|
4) Start a local web server:
|
||
|
|
||
|
```bash
|
||
|
npx http-server .
|
||
|
```
|
||
|
|
||
|
Access `http://localhost:8080` from your browser. Add a few items and click
|
||
|
the "Export!" button to generate a new file.
|