Skip to content

natanaelsimoes/mongoose-csv

 
 

Repository files navigation

mongoose-csv

This is a mongoose plugin that creates a CsvBuilder instance for your Schema, fully compatible with TypeScript.

Usage

import express, { Request, Response } from 'express';
import mongoose from 'mongoose';
import csv from 'mongoose-csv-export';
import fs from 'fs';

interface IUserSchema extends mongoose.Document {
  fullname: string;
  email: string;
  age: number;
  username: string;
}

var UserSchema = new mongoose.Schema<IUserSchema>({
  fullname: String,
  email: String,
  age: Number,
  username: String,
});

UserSchema.plugin(csv, {
  headers: 'Firstname Lastname Username Email Age',
  alias: {
    'Username': 'username',
    'Email': 'email',
    'Age': 'age'
  },
  virtuals: {
    'Firstname': function(doc) {
      return doc.fullname.split(' ')[0];
    },
    'Lastname': function(doc) {
      return doc.fullname.split(' ')[1];
    }
  }
});

var User = mongoose.model<IUserSchema>('Users', UserSchema);

// Query and stream
User.findAndStreamCsv({age: {$lt: 40}})
  .pipe(fs.createWriteStream('users_under_40.csv'));

// Create stream from query results
User.find({}).exec()
  .then((docs) => {
    User.csvReadStream(docs)
      .pipe(fs.createWriteStream('users.csv'));
  });

// Transform mongoose streams
User.find({})
  .where('age').gt(20).lt(30)
  .limit(10)
  .sort('age')
  .stream()
  .pipe(User.csvTransformStream())
  .pipe(fs.createWriteStream('users.csv'));

// Pipe it to an express route
const app = express();
app.get('/', async (req: Request, res: Response) => {
  const docs = await Test.find({}).exec();
  res.header('Content-Type', 'text/csv; charset=utf-8');
  Test.csvReadStream(docs).pipe(res);
});
app.listen(5000);

Installation

$ npm install mongoose-csv-export
# OR
$ yarn add mongoose-csv-export

Testing

Running tests requires a local mongodb server, and mocha. While most likely not a namespace issue, the test script will create a database __mongoose_csv_test__, and drop the database when finished. You have been warned.

$ npm test

API

Schema.plugin(mongooseToCsv, options)

The options argument is passed to the CsvBuilder instance, please refer to the Docs for more in-depth details. The only aditional property that can be included is the virutals property. The virtuals have nothing to do with mongoose virtuals.

Schema.csvReadStream([docs])

Creates a csv formated read stream from query results.

  • docs: mongoose query result documents

Schema.csvTransformStream()

Transforms mongoose querystreams to csv formated streams.

Schema.findAndStreamCsv(query)

  • query: mongoose query object

This is just a convenience method for:

Schema.find(query).cursor().pipe(Schema.csvTransformStream())

Schema.aggregateAndStreamCsv(pipelines)

  • pipelines: mongoose pipelines array

This is just a convenience method for:

Schema.aggregate(pipelines).cursor().pipe(Schema.csvTransformStream())

Acknowledgments

Thanks to Nick Pisacane for his great job with the original CSV exporter that this repo is based on.

About

Create .csv exports from mongoose models

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages

  • TypeScript 94.9%
  • JavaScript 5.1%