Skip to main content

Mongo

A accounts-js database adapter for MongoDB

View source code for @accounts/mongo.

Installation​

yarn add @accounts/mongo

Usage​

In order to use the mongo adaptor in your project, you will need to pass a valid mongo connection to @accounts/mongo:

import { MongoClient } from 'mongodb';
import { AccountsServer } from '@accounts/server';
import { Mongo } from '@accounts/mongo';

// If you are using mongodb 3.x
const client = await mongodb.MongoClient.connect(process.env.MONGO_URL);
const db = client.db('my-db-name');

// If you are using mongodb 2.x
const db = await mongodb.MongoClient.connect(process.env.MONGO_URL);

const accountsMongo = new Mongo(db, {
// options
});
const accountsServer = new AccountsServer(
{ db: accountsMongo },
{
// services
}
);

// Will create the necessary mongo indexes
await accountsMongo.setupIndexes();

Usage with mongoose​

If you are using mongoose in your application, you can reuse the mongoose connection like this:

import mongoose from 'mongoose';
import { AccountsServer } from '@accounts/server';
import { Mongo } from '@accounts/mongo';

mongoose.connect(process.env.MONGO_URL);
const db = mongoose.connection;

const accountsMongo = new Mongo(db, {
// options
});
const accountsServer = new AccountsServer(
{ db: accountsMongo },
{
// services
}
);

// Will create the necessary mongo indexes
await accountsMongo.setupIndexes();

Setup mongodb indexes​

It's really important that your production database have the necessary mongodb indexes in order to perform fast queries.

To do so, when your server is booting, run the following command:

await accountsMongo.setupIndexes();

Options​

You can use the following options to configure the @accounts/mongo behavior.

interface AccountsMongoOptions {
/**
* The users collection name.
* Default 'users'.
*/
collectionName?: string;
/**
* The sessions collection name.
* Default 'sessions'.
*/
sessionCollectionName?: string;
/**
* The timestamps for the users and sessions collection.
* Default 'createdAt' and 'updatedAt'.
*/
timestamps?: {
createdAt: string;
updatedAt: string;
};
/**
* Should the user collection use _id as string or ObjectId.
* Default 'true'.
*/
convertUserIdToMongoObjectId?: boolean;
/**
* Should the session collection use _id as string or ObjectId.
* Default 'true'.
*/
convertSessionIdToMongoObjectId?: boolean;
/**
* Perform case intensitive query for user name.
* Default 'true'.
*/
caseSensitiveUserName?: boolean;
/**
* Function that generate the id for new objects.
*/
idProvider?: () => string | object;
/**
* Function that generate the date for the timestamps.
* Default to `(date?: Date) => (date ? date.getTime() : Date.now())`.
*/
dateProvider?: (date?: Date) => any;
}

Example using GraphQL​

A working example is available here.

Example using Rest​

A working example is available here.