Understand PrismaPrisma & Traditional ORMs

Prisma & Mongoose

Learn how Prisma compares to Mongoose

Reading data

Fetching single objects

Mongoose

const user = await findById(id)

Prisma

const user = await prisma.user({ id })

Fetching selected scalars of single objects

Mongoose

const user = await findById(id).select('id email')

Prisma

const userFragment = await prisma.user({ id }).$fragment(`
  fragment NameAndEmail on User { id email }`
`)

Fetching relations

Mongoose

const userWithPosts = await User.findById(id).populate('posts')

Prisma

Fluent API
Using fragments
Native GraphQL
const postsByUser = await prisma.user({ id }).posts()
Copy

Filtering for concrete values

Mongoose

const user = await User.find({
  name: 'Alice',
})

Prisma

const user = await prisma.users({
  where: {
    name: 'Alice',
  },
})

Other filter criteria

Mongoose

Mongoose exposes the MongoDB query selectors as filter criteria.

Prisma

Prisma generates many additional filters that are commonly used in modern application development:

  • <field>_ends_with & <field>_starts_with
  • <field>_not_ends_with & <field>_not_starts_with
  • <field>_gt & <field>_gte
  • <field>_lt & <field>_lte
  • <field>_contains & <field>_not_contains
  • <field>_in & <field>_not_in

Relation filters

Mongoose

Mongoose doesn't offer a dedicated API for relation filters. You can get similar functionality by sending a raw SQL query to the database.

Prisma

Prisma lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a relation of that model.

For example, you want to fetch only those users that wrote a post with the title "Hello World". The filter criteria is therefore not referencing the user model, but the post model that's related to the user model:

query {
  user(where: {
    posts_some: {
      title: "Hello World"
    }
  }) {
    id
  }
}

Pagination

Mongoose

const posts = await Post.find({
  skip: 5,
  limit: 10,
})

Prisma

const posts = await prisma.posts({
  skip: 5,
  first: 10,
})

In addition to skip and first, the Prisma API also offers:

  • last
  • before & after for cursor based pagination
  • Relay-style pagination

Writing data

Creating objects

Mongoose

Using `create`
Using `save`
const user = await User.create({
  name: 'Alice',
  email: 'alice@prisma.io',
})
Copy

Prisma

const user = await new User({
  name: 'Alice',
  email: 'alice@prisma.io',
})

Updating objects

Mongoose

Using `findOneAndUpdate`
Using `save`
const updatedUser = await User.findOneAndUpdate(
  { _id: id },
  {
    $set: {
      name: 'James',
      email: 'james@prisma.io',
    },
  },
)
Copy

Prisma

const updatedUser = await prisma.updateUser({
  where: { id },
  data: {
    name: 'James',
    email: 'james@prisma.io',
  },
})

Deleting objects

Mongoose

await User.deleteOne({ _id: id })

Prisma

const deletedUser = await prisma.deleteUser({ id })