Back to Prisma

MongoDB

apps/docs/content/docs/(index)/prisma-orm/add-to-existing-project/mongodb.mdx

latest10.5 KB
Original Source

MongoDB is a popular document-based NoSQL database known for its flexibility, scalability, and developer-friendly features. 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.

:::warning[MongoDB support for Prisma ORM v7]

MongoDB support for Prisma ORM v7 is coming in the near future. In the meantime, please use Prisma ORM v6.19 (the latest v6 release) when working with MongoDB.

This guide uses Prisma ORM v6.19 to ensure full compatibility with MongoDB.

:::

:::tip

If you're migrating to Prisma ORM from Mongoose, see our Migrate from Mongoose guide.

:::

Prerequisites

In order to successfully 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.

:::warning

The MongoDB database connector uses transactions to support nested writes. Transactions require a replica set deployment. The easiest way to deploy a replica set is with Atlas. It's free to get started.

:::

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

:::note

If your project contains multiple directories with package.json files (e.g., frontend, backend, etc.), note that Prisma ORM is specifically designed for use in the API/backend layer. To set up Prisma, navigate to the appropriate backend directory containing the relevant package.json file and configure Prisma there.

:::

1. Set up Prisma ORM

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

npm
npm install [email protected] @types/node --save-dev
npm install @prisma/[email protected] 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

:::info[Why Prisma v6.19?]

This is the latest stable version of Prisma ORM v6 that fully supports MongoDB. MongoDB support for Prisma ORM v7 is coming soon.

You can also install prisma@6 and @prisma/client@6 to automatically get the latest v6 release.

:::

2. Initialize Prisma ORM

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

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:

typescript
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:

typescript
import "dotenv/config"; // [!code ++]
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:

prisma
generator client {
  provider = "prisma-client"
  output   = "../generated/prisma"
}

datasource db {
  provider = "mongodb"
  url = env("DATABASE_URL")
}

3. Connect your database

Update the .env file with your MongoDB connection URL:

text
DATABASE_URL="mongodb+srv://username:[email protected]/mydb"

For MongoDB Atlas, the connection URL format is:

mongodb+srv://USERNAME:[email protected]/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

:::tip

For MongoDB Atlas, you can manually append the database name to the connection URL, as Atlas doesn't include it by default.

:::

Troubleshooting connection issues

  • 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.

4. Introspect your database

Run the following command to introspect your existing database:

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

:::info

MongoDB introspection limitations: Prisma introspects MongoDB by sampling documents. You may need to manually:

  • Add relation fields using the @relation attribute
  • Adjust field types if the sampling didn't capture all variations
  • Add indexes and constraints not detected during introspection

:::

5. Generate Prisma ORM types

Generate Prisma Client based on your introspected schema:

npm
npx prisma generate

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

6. Instantiate Prisma Client

Create a utility file to instantiate Prisma Client:

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

const prisma = new PrismaClient();

export { prisma };

7. Query your database

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

typescript
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:

npm
npx tsx script.ts

8. Evolve your schema

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

8.1. Update your Prisma schema file

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

prisma
model Post { // [!code ++]
  id        String   @id @default(auto()) @map("_id") @db.ObjectId // [!code ++]
  title     String // [!code ++]
  content   String? // [!code ++]
  published Boolean  @default(false) // [!code ++]
  authorId  String   @db.ObjectId // [!code ++]
  author    User     @relation(fields: [authorId], references: [id]) // [!code ++]
} // [!code ++]

model User { // [!code ++]
  id    String @id @default(auto()) @map("_id") @db.ObjectId // [!code ++]
  email String @unique // [!code ++]
  name  String? // [!code ++]
  posts Post[] // [!code ++]
} // [!code ++]

:::info

In MongoDB, the id field is mapped to _id and uses @db.ObjectId type. Relations use String type with @db.ObjectId annotation.

:::

8.2. Push the changes to your database

npm
npx prisma db push

This command:

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

:::info[Why db push instead of migrations?]

MongoDB uses a flexible schema model. Prisma Migrate (which creates migration files) is not supported for MongoDB. Always use prisma db push to sync your schema changes.

:::

9. Explore your data

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

:::warning

Prisma Studio does not currently support MongoDB. Support may be added in a future release. See Databases supported by Prisma Studio for more information.

:::

Next steps

You've successfully set up Prisma ORM. Here's what you can explore 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

More info