Node.js と MongoDB ネイティブ ドライバーを使用した高速かつ柔軟な CRUD API の構築

WBOY
リリース: 2024-08-07 01:21:13
オリジナル
707 人が閲覧しました

Building a Fast and Flexible CRUD API with Node.js and MongoDB Native Drivers

MongoDB ネイティブ ドライバーで Node.js と Express を使用する: その理由と方法

Node.js と Express を使用している場合は、MongoDB の人気のある ODM (オブジェクト データ モデリング) ライブラリである Mongoose に遭遇したことがあるかもしれません。 Mongoose は多くの便利な機能を提供しますが、MongoDB のネイティブ ドライバーを直接操作することを選択する理由もあります。この投稿では、MongoDB ネイティブ ドライバーを使用する利点を説明し、MongoDB ネイティブ ドライバーを使用してシンプルな CRUD API を実装する方法を共有します。

MongoDB ネイティブ ドライバーを使用する理由

  1. パフォーマンス: MongoDB ネイティブ ドライバーは、Mongoose が導入する追加の抽象化レイヤーを使用せずに MongoDB と直接対話することで、より優れたパフォーマンスを提供します。これは、高パフォーマンスのアプリケーションにとって特に有益です。

  2. 柔軟性: ネイティブ ドライバーにより、クエリとデータのやり取りをより詳細に制御できます。 Mongoose は、スキーマとモデルを使用して何らかの構造を課しますが、これはすべてのユースケースにとって理想的ではない可能性があります。

  3. オーバーヘッドの削減: ネイティブ ドライバーを使用すると、Mongoose のスキーマとモデルを維持するための追加のオーバーヘッドが回避され、コードベースが簡素化されます。

  4. 学習の機会: ネイティブ ドライバーを直接操作すると、MongoDB の操作をより深く理解できるようになり、素晴らしい学習体験になります。

MongoDB ネイティブ ドライバーを使用した CRUD API の実装

ここでは、Node.js、Express、MongoDB ネイティブ ドライバーを使用してシンプルな CRUD API を設定する方法についてのステップバイステップ ガイドを示します。

1. データベース接続のセットアップ

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 };
ログイン後にコピー

2. モデルを定義する

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;
ログイン後にコピー

3. ルートの設定

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;
ログイン後にコピー

4. コントローラーの実装

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;
ログイン後にコピー

5. 構成

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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!