Topics Fastify & Databases MongoDB with Mongoose
intermediate 15 min read

MongoDB with Mongoose

Integrate Mongoose ODM with Fastify for MongoDB-based applications.

Mongoose Plugin for Fastify

const Fastify = require('fastify');\nconst fp = require('fastify-plugin');\nconst mongoose = require('mongoose');\n\n// Mongoose plugin\nasync function mongoosePlugin(fastify, opts) {\n  const uri = opts.uri || process.env.MONGO_URI || 'mongodb://localhost:27017/myapp';\n\n  await mongoose.connect(uri);\n\n  // Define models\n  const userSchema = new mongoose.Schema({\n    name: { type: String, required: true },\n    email: { type: String, required: true, unique: true },\n    createdAt: { type: Date, default: Date.now },\n  });\n\n  const User = mongoose.model('User', userSchema);\n\n  // Decorate with models\n  fastify.decorate('models', { User });\n\n  fastify.addHook('onClose', async () => {\n    await mongoose.disconnect();\n  });\n}\n\napp.register(fp(mongoosePlugin, { name: 'mongoose' }));\n\n// Usage\napp.get('/api/users', async (request) => {\n  const users = await app.models.User\n    .find()\n    .select('-__v')\n    .sort({ createdAt: -1 })\n    .lean();\n\n  return { data: users };\n});

Examples

const Fastify = require('fastify');
const fp = require('fastify-plugin');
const mongoose = require('mongoose');

const app = Fastify({ logger: true });

const mongoosePlugin = fp(async (fastify) => {
  await mongoose.connect(process.env.MONGO_URI || 'mongodb://localhost:27017/test');

  const itemSchema = new mongoose.Schema({
    name: { type: String, required: true },
    price: { type: Number, min: 0 },
    inStock: { type: Boolean, default: true },
  });

  fastify.decorate('Item', mongoose.model('Item', itemSchema));
  fastify.addHook('onClose', () => mongoose.disconnect());
});

app.register(mongoosePlugin);

app.get('/items', async (request) => {
  const { minPrice, maxPrice, inStock } = request.query;
  const filter = {};

  if (minPrice || maxPrice) {
    filter.price = {};
    if (minPrice) filter.price.\$gte = Number(minPrice);
    if (maxPrice) filter.price.\$lte = Number(maxPrice);
  }
  if (inStock !== undefined) filter.inStock = inStock === 'true';

  return app.Item.find(filter).sort({ name: 1 }).lean();
});

app.listen({ port: 3000 });

Your Notes

Sign in to take notes for this lesson.

Quiz

Fastify & Databases Quiz

0 questions

Sign in to take quiz

Discussion

Sign in to join the discussion.

Flashcards

Sign in to create flashcards.