Skip to main content
Prisma Documentation Docs

Search documentation

Type to search this documentation.

On this pageOverview

MongoDB

MongoDB is a document-based NoSQL database. In this guide, you will learn how to add Prisma ORM to an existing TypeScript project, connect it to MongoDB, introspect your existing database schema, and start querying with type-safe Prisma Client.

To complete this guide, you need:

  • Node.js installed on your machine (see system requirements for officially supported versions)
  • An existing TypeScript project with a package.json file
  • Access to a MongoDB 4.2+ server with a replica set deployment. We recommend using MongoDB Atlas.

Make sure you have your database connection URL (that includes your authentication credentials) at hand.

Navigate to your existing project directory and install the required dependencies:

title="bun"
bun add prisma@6.19.3 @types/node --dev

bun add @prisma/client@6.19.3 dotenv
pnpm
pnpm add prisma@6.19.3 @types/node --save-dev
pnpm add @prisma/client@6.19.3 dotenv
yarn
yarn add prisma@6.19.3 @types/node --dev
yarn add @prisma/client@6.19.3 dotenv
npm
npm install prisma@6.19.3 @types/node --save-dev
npm install @prisma/client@6.19.3 dotenv

Here's what each package does:

  • prisma - The Prisma CLI for running commands like prisma init, prisma db pull, and prisma generate
  • @prisma/client - The Prisma Client library for querying your database
  • dotenv - Loads environment variables from your .env file

Set up your Prisma ORM project by creating your Prisma Schema file with the following command:

title="bun"
bunx --bun prisma init --datasource-provider mongodb --output ../generated/prisma
pnpm
pnpm prisma init --datasource-provider mongodb --output ../generated/prisma
yarn
yarn prisma init --datasource-provider mongodb --output ../generated/prisma
npm
npx prisma init --datasource-provider mongodb --output ../generated/prisma

This command does a few things:

  • Creates a prisma/ directory with a schema.prisma file containing your database connection configuration
  • Creates a .env file in the root directory for environment variables
  • Creates a prisma.config.ts file for Prisma configuration

The generated prisma.config.ts file looks like this:

title="prisma.config.ts"
import { defineConfig, env } from "prisma/config";

export default defineConfig({

  schema: "prisma/schema.prisma",

  migrations: {

    path: "prisma/migrations",

  },

  engine: "classic",

  datasource: {

    url: env("DATABASE_URL"),

  },

});

Add dotenv to prisma.config.ts so that Prisma can load environment variables from your .env file:

title="prisma.config.ts"
import "dotenv/config"; 

import { defineConfig, env } from "prisma/config";

export default defineConfig({

  schema: "prisma/schema.prisma",

  migrations: {

    path: "prisma/migrations",

  },

  engine: "classic",

  datasource: {

    url: env("DATABASE_URL"),

  },

});

The generated schema uses the ESM-first prisma-client generator with a custom output path:

title="prisma/schema.prisma"
generator client {

  provider = "prisma-client"

  output   = "../generated/prisma"

}

datasource db {

  provider = "mongodb"

  url = env("DATABASE_URL")

}

Update the .env file with your MongoDB connection URL:

title=".env"
DATABASE_URL="mongodb+srv://username:password@cluster.mongodb.net/mydb"

For MongoDB Atlas, the connection URL format is:

mongodb+srv://USERNAME:PASSWORD@CLUSTER.mongodb.net/DATABASE

Self-hosted MongoDB connection URL format:

mongodb://USERNAME:PASSWORD@HOST:PORT/DATABASE

Connection URL components:

  • USERNAME: Your database user name
  • PASSWORD: Your database user password
  • HOST: The host where mongod or mongos is running
  • PORT: The port where your database server is running (typically 27017)
  • DATABASE: The name of your database
  • Authentication failed: If you see a SCRAM failure: Authentication failed error, add ?authSource=admin to the end of your connection string.
  • Empty database name: If you see an Error code 8000 (AtlasError): empty database name not allowed error, append the database name to your connection URL. See this GitHub issue for details.

Run the following command to introspect your existing database:

title="bun"
bunx prisma db pull
pnpm
pnpm prisma db pull
yarn
yarn prisma db pull
npm
npx prisma db pull

This command:

  • Reads the DATABASE_URL from your .env file
  • Connects to your MongoDB database
  • Samples documents in your collections to infer the schema
  • Generates Prisma models in your schema.prisma file
Introspect your database with Prisma ORM

Generate Prisma Client based on your introspected schema:

title="bun"
bunx prisma generate
pnpm
pnpm prisma generate
yarn
yarn prisma generate
npm
npx prisma generate

This creates a type-safe Prisma Client tailored to your database schema in the generated/prisma directory.

Create a utility file to instantiate Prisma Client:

title="lib/prisma.ts"
import "dotenv/config";

import { PrismaClient } from "../generated/prisma/client";

const prisma = new PrismaClient();

export { prisma };

Now you can use Prisma Client to query your database. Create a script.ts file:

title="script.ts"
import { prisma } from "./lib/prisma";

async function main() {

  // Example: Fetch all records from a collection

  // Replace 'user' with your actual model name

  const allUsers = await prisma.user.findMany();

  console.log("All users:", JSON.stringify(allUsers, null, 2));

}

main()

  .then(async () => {

    await prisma.$disconnect();

  })

  .catch(async (e) => {

    console.error(e);

    await prisma.$disconnect();

    process.exit(1);

  });

Run the script:

title="bun"
bunx tsx script.ts
pnpm
pnpm dlx tsx script.ts
yarn
yarn dlx tsx script.ts
npm
npx tsx script.ts

MongoDB doesn't support migrations like relational databases. Instead, use db push to sync schema changes:

Modify your Prisma schema file with the changes you want. For example, add a new model:

title="prisma/schema.prisma"
model Post { 

  id        String   @id @default(auto()) @map("_id") @db.ObjectId

  title     String

  content   String?

  published Boolean  @default(false) 

  authorId  String   @db.ObjectId

  author    User     @relation(fields: [authorId], references: [id]) 

} 

model User { 

  id    String @id @default(auto()) @map("_id") @db.ObjectId

  email String @unique

  name  String?

  posts Post[]

} 
title="bun"
bunx prisma db push
pnpm
pnpm prisma db push
yarn
yarn prisma db push
npm
npx prisma db push

This command:

  • Applies schema changes to your MongoDB database
  • Automatically regenerates Prisma Client

You can use MongoDB Atlas, the MongoDB shell, or MongoDB Compass to view and manage your data.

Prisma ORM is set up. These are the pages you are most likely to need next:

  • Learn more about Prisma Client: Explore the Prisma Client API for advanced querying, filtering, and relations
  • Database migrations: Learn about Prisma Migrate for evolving your database schema
  • Performance optimization: Discover query optimization techniques
  • Build a full application: Check out our framework guides to integrate Prisma ORM with Next.js, Express, and more
  • Join the community: Connect with other developers on Discord
Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu