MongoDBを使用してNext.jsのWebアプリケーションを作成してみた

公開日: 2023/7/25

本記事では、MongoDBを使用したNext.jsのWEBアプリケーションの作成方法について解説します。

MongoDBはNoSQLの一つで、柔軟なデータベース設計や高速なデータ処理が可能なため、Webアプリケーションの開発において人気があります。


Next.jsはReactのフレームワークであり、サーバーサイドレンダリングをサポートしています。

MongoDBとNext.jsを組み合わせることで、高速で柔軟性の高いWebアプリケーションを作成することができます。

1. はじめに


今回の記事では、以下の内容を扱います。

1.MongoDBとは
2.Next.jsとは
3.MongoDBとNext.jsの組み合わせのメリット
4.MongoDBを使用したNext.jsの開発手順
5.MongoDBとは


MongoDBは、オープンソースのNoSQLデータベースです。

データベースにデータを保存する際に、テーブルのような構造ではなく、JSON形式でデータを保存するため、柔軟なデータベース設計が可能です。


また、MongoDBは水平方向のスケールアップに対応しており、高速なデータ処理が可能です。

MongoDBは、Webアプリケーションの開発において広く使用されています。

2. Next.jsとは


Next.jsは、Reactのフレームワークです。

Reactは、UIコンポーネントを作成するためのライブラリであり、JavaScriptの知識があれば、比較的簡単に学ぶことができます。


Next.jsは、サーバーサイドレンダリングをサポートしており、SEO対策やページの表示速度向上に効果があります。

3. MongoDBとNext.jsの組み合わせのメリット


MongoDBとNext.jsを組み合わせることで、以下のようなメリットがあります。

1.柔軟なデータベース設計が可能
2.高速なデータ処理が可能
3.サーバーサイドレンダリングによるSEO対策やページ表示速度向上
4.MongoDBを使用したNext.jsの開発手順

次に、MongoDBを使用したNext.jsの開発手順について解説します。

4. MongoDBのインストールと設定


まずはじめに、MongoDBをインストールし、設定を行います。

MongoDBの公式サイトからダウンロードしてインストールします。

インストールが完了したら、MongoDBを起動します。

5. データベースへの接続


では、実際にMongoDBと接続してみましょう。

まずはMongoDBのドライバーであるmongodbパッケージをインストールします。

npm install mongodb

次に、接続先のURLを指定してMongoDBに接続します。

今回はローカルにインストールされたMongoDBに接続します。

import { MongoClient } from 'mongodb';

const url = 'mongodb://localhost:27017';
const dbName = 'my-database';

const client = new MongoClient(url);

(async () => {
  try {
    await client.connect();
    console.log('Connected successfully to server');

    const db = client.db(dbName);
    const collection = db.collection('my-collection');

    // データの操作
    // ...

  } catch (error) {
    console.error(error);
  } finally {
    await client.close();
    console.log('Disconnected successfully from server');
  }
})();

MongoClientを使ってMongoDBに接続し、接続に成功したら指定したデータベース名のdbオブジェクトを取得します。

そして、db.collection()メソッドを使って、操作するコレクションを指定します。

このコレクションを操作することで、データの読み書きが可能になります。

6. データの追加・取得・更新・削除


それでは、実際にデータの追加・取得・更新・削除をしてみましょう。

6-1. データの追加

const result = await collection.insertOne({
  name: 'John Doe',
  age: 30,
  email: 'john@example.com'
});

console.log(result.insertedId);

insertOne()メソッドを使ってデータを追加します。

引数には追加するデータをオブジェクト形式で指定します。


insertOne()メソッドはPromiseを返すので、awaitキーワードを使って結果を取得することができます。

返り値として挿入されたドキュメントの_idが返されるため、これを利用して挿入されたデータを参照することができます。

6-2. データの取得

const cursor = collection.find({ age: { $gt: 20 } });

await cursor.forEach(doc => {
  console.log(doc);
});

find()メソッドを使ってデータを取得します。

引数には検索条件をオブジェクト形式で指定します。


今回は、ageフィールドが20より大きいドキュメントを検索しています。

find()メソッドの戻り値はCursorオブジェクトであり、forEach()メソッドを使って、検索結果を順番に取り出しています。

7. アプリケーションの実装


これで、必要なすべてのパッケージがインストールされました。

それでは、次にアプリケーションを実装しましょう。


まず、pagesフォルダにindex.jsファイルを作成します。

次のように、必要なパッケージをインポートします。

import Head from 'next/head'
import Layout from '../components/layout'
import { MongoClient } from 'mongodb'

export default function Home({ posts }) {
  return (
    <Layout>
      <Head>
        <title>My Blog</title>
      </Head>
      <h1>Welcome to my blog!</h1>
      <ul>
        {posts.map(post => (
          <li key={post._id}>{post.title}</li>
        ))}
      </ul>
    </Layout>
  )
}

このコードでは、Headコンポーネントを使用してページのタイトルを設定し、Layoutコンポーネントを使用してページのレイアウトを設定しています。

MongoClientを使用してデータベースに接続し、postsをプロップスとして受け取り、それらをリスト表示します。


次に、データベースに接続するためのコードを追加します。

pages/index.jsの先頭に次のコードを追加してください。

export async function getServerSideProps() {
  const client = await MongoClient.connect(process.env.MONGODB_URI)
  const db = client.db()

  const postsCollection = db.collection('posts')
  const posts = await postsCollection.find().toArray()

  client.close()

  return {
    props: {
      posts: posts.map(post => ({
        title: post.title,
        _id: post._id.toString(),
      })),
    },
  }
}

このコードでは、getServerSideProps関数を使用してサーバーサイドでデータを取得しています。

8. まとめ

本記事では、Next.jsとMongoDBを使用したWEBアプリの作成について解説しました。


MongoDBとNext.jsを組み合わせることで、高速でスケーラブルなWEBアプリケーションを作成することができます。

ただし、データベースの設計やセキュリティについては注意が必要です。

また、フロントエンド側での実装においても、APIルートの実装方法やデータの取得方法については適切に扱う必要があります。


今後も、MongoDBとNext.jsを活用したWEBアプリケーションの需要は伸びていくと思うので、どんどん学習していきましょう。