Node.js と Express を使用している場合は、MongoDB の人気のある ODM (オブジェクト データ モデリング) ライブラリである Mongoose に遭遇したことがあるかもしれません。 Mongoose は多くの便利な機能を提供しますが、MongoDB のネイティブ ドライバーを直接操作することを選択する理由もあります。この投稿では、MongoDB ネイティブ ドライバーを使用する利点を説明し、MongoDB ネイティブ ドライバーを使用してシンプルな CRUD API を実装する方法を共有します。
パフォーマンス: MongoDB ネイティブ ドライバーは、Mongoose が導入する追加の抽象化レイヤーを使用せずに MongoDB と直接対話することで、より優れたパフォーマンスを提供します。これは、高パフォーマンスのアプリケーションにとって特に有益です。
柔軟性: ネイティブ ドライバーにより、クエリとデータのやり取りをより詳細に制御できます。 Mongoose は、スキーマとモデルを使用して何らかの構造を課しますが、これはすべてのユースケースにとって理想的ではない可能性があります。
オーバーヘッドの削減: ネイティブ ドライバーを使用すると、Mongoose のスキーマとモデルを維持するための追加のオーバーヘッドが回避され、コードベースが簡素化されます。
学習の機会: ネイティブ ドライバーを直接操作すると、MongoDB の操作をより深く理解できるようになり、素晴らしい学習体験になります。
ここでは、Node.js、Express、MongoDB ネイティブ ドライバーを使用してシンプルな CRUD API を設定する方法についてのステップバイステップ ガイドを示します。
MongoDB 接続を管理するための utils/db.js ファイルを作成します。
require('dotenv').config() const dbConfig = require('../config/db.config'); const { MongoClient } = require('mongodb'); const client = new MongoClient(dbConfig.url); let _db; let connectPromise; async function connectToDb() { if (!connectPromise) { connectPromise = new Promise(async (resolve, reject) => { try { await client.connect(); console.log('Connected to the database ?', client.s.options.dbName); _db = client.db(); resolve(_db); } catch (error) { console.error('Error connecting to the database:', error); reject(error); } }); } return connectPromise; } function getDb() { if (!_db) { throw new Error('Database not connected'); } return _db; } function isDbConnected() { return Boolean(_db); } module.exports = { connectToDb, getDb, isDbConnected };
MongoDB コレクションと対話するための models/model.js ファイルを作成します。
const { ObjectId } = require('mongodb'); const db = require('../utils/db'); class AppModel { constructor($collection) { this.collection = null; (async () => { if (!db.isDbConnected()) { console.log('Waiting for the database to connect...'); await db.connectToDb(); } this.collection = db.getDb().collection($collection); console.log('Collection name:', $collection); })(); } async find() { return await this.collection.find().toArray(); } async findOne(condition = {}) { const result = await this.collection.findOne(condition); return result || 'No document Found!'; } async create(data) { data.createdAt = new Date(); data.updatedAt = new Date(); let result = await this.collection.insertOne(data); return `${result.insertedId} Inserted successfully`; } async update(id, data) { let condition = await this.collection.findOne({ _id: new ObjectId(id) }); if (condition) { const result = await this.collection.updateOne({ _id: new ObjectId(id) }, { $set: { ...data, updatedAt: new Date() } }); return `${result.modifiedCount > 0} Updated successfully!`; } else { return `No document found with ${id}`; } } async deleteOne(id) { const condition = await this.collection.findOne({ _id: new ObjectId(id) }); if (condition) { const result = await this.collection.deleteOne({ _id: new ObjectId(id) }); return `${result.deletedCount > 0} Deleted successfully!`; } else { return `No document found with ${id}`; } } } module.exports = AppModel;
API ルートを定義するために、index.js ファイルを作成します。
const express = require('express'); const router = express.Router(); const users = require('../controllers/userController'); router.get("/users", users.findAll); router.post("/users", users.create); router.put("/users", users.update); router.get("/users/:id", users.findOne); router.delete("/users/:id", users.deleteOne); module.exports = router;
CRUD 操作を処理するための userController.js ファイルを作成します。
const { ObjectId } = require('mongodb'); const Model = require('../models/model'); const model = new Model('users'); let userController = { async findAll(req, res) { model.find() .then(data => res.send(data)) .catch(err => res.status(500).send({ message: err.message })); }, async findOne(req, res) { let condition = { _id: new ObjectId(req.params.id) }; model.findOne(condition) .then(data => res.send(data)) .catch(err => res.status(500).send({ message: err.message })); }, create(req, res) { let data = req.body; model.create(data) .then(data => res.send(data)) .catch(error => res.status(500).send({ message: error.message })); }, update(req, res) { let id = req.body._id; let data = req.body; model.update(id, data) .then(data => res.send(data)) .catch(error => res.status(500).send({ message: error.message })); }, deleteOne(req, res) { let id = new ObjectId(req.params.id); model.deleteOne(id) .then(data => res.send(data)) .catch(error => res.status(500).send({ message: error.message })); } } module.exports = userController;
MongoDB 接続文字列を .env ファイルに保存し、それをロードする db.config.js ファイルを作成します。
module.exports = { url: process.env.DB_CONFIG, };
Mongoose から MongoDB ネイティブ ドライバーへの切り替えは、特定のプロジェクトにとって戦略的な選択となり、パフォーマンス上の利点と柔軟性の向上が得られます。ここで提供される実装は、Node.js および MongoDB ネイティブ ドライバーを使用してアプリケーションの構築を開始するための強固な基盤を提供します。
GitHub で完全なコードを自由にチェックして、独自のプロジェクトの機能や拡張機能をさらに探索してください。
さらにご質問がございましたら、お気軽にコメントしてください。
コーディングを楽しんでください! ?
以上がNode.js と MongoDB ネイティブ ドライバーを使用した高速かつ柔軟な CRUD API の構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。