docs/1.23/understand-prisma/prisma-vs-traditional-orms/prisma-vs-mongoose-ys8c.mdx
import Code from "components/Markdown/Code"
export const meta = { title: "Prisma & Mongoose", position: 80, description: "Learn how Prisma compares to Mongoose" }
Mongoose
const user = await findById(id)
Prisma
const user = await prisma.user({ id })
Mongoose
const user = await findById(id)
.select("id email")
Prisma
const userFragment = await prisma.user({ id }).$fragment(`
fragment NameAndEmail on User { id email }`
`)
Mongoose
const userWithPosts = await User
.findById(id)
.populate("posts")
Prisma
<Code languages={["Fluent API", "Using fragments", "Native GraphQL"]}>
const postsByUser = await prisma
.user({ id })
.posts()
const userWithPosts = await prisma
.user({ id })
.$fragment(`
fragment UserPosts on User {
posts { id title content published }
}
`)
const userWithPosts = await prisma
.$graphql(`
query ($id: ID!) {
user(id: $id) {
posts { id title content published }
}
}
`,
{ id }
)
Mongoose
const user = await User.find({
name: "Alice"
})
Prisma
const user = await prisma.users({
where: {
name: "Alice"
}
})
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_inMongoose
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
}
}
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:
lastbefore & after for cursor based paginationMongoose
<Code languages={["Using create", "Using save"]}>
const user = await User.create({
name: "Alice",
email: "[email protected]"
})
const user = new User({
name: "Alice",
email: "[email protected]"
})
await user.save()
Prisma
const user = await new User({
name: "Alice",
email: "[email protected]"
})
Mongoose
<Code languages={["Using findOneAndUpdate", "Using save"]}>
const updatedUser = await User.findOneAndUpdate(
{ _id: id },
{
$set: {
name: "James",
email: "[email protected]"
}
}
)
user.name = "James"
user.email =" [email protected]"
await user.save()
Prisma
const updatedUser = await prisma.updateUser({
where: { id },
data: {
name: "James",
email: "[email protected]"
}
})
Mongoose
await User.deleteOne({ _id: id })
Prisma
const deletedUser = await prisma.deleteUser({ id })