MongoDBの基本概念・CRUD操作を解説!

公開日:2022-09-17

https://youtu.be/WVX_ksciv5o

https://youtu.be/WyhpOquZAfg

はじめに

今回は、MongoDBの基本概念を説明をして、基本的な操作方法を説明をします。

基本概念

まず、MongoDBとは、NoSQLの一種で「ドキュメント」と呼ばれる構造的データをJSONに似ている形式で表現し、そのドキュメントの集合を「コレクション」として管理するデータベース管理システムです。

たとえば、SQLデータベースを使用したブログ投稿サイトがあったとします。SQLデータベースはテーブルと呼ばれる形式でデータを管理しています。投稿者と投稿記事はそれぞれ違うテーブルに格納され、投稿者idで投稿者と投稿記事を結びつけることができます。しかし、スケールが大きくなるにつれ、テーブルの関係が複雑になりデータ検索をするのに時間がかかります。それに対して、NoSQLのMongoDBはテーブルの代わりにコレクションと呼ばれる形式でデータを管理します。各コレクションの中に、ドキュメントと呼ばれる単位で1件分のデータを格納します。また、各ドキュメントに違う項目のデータを入れることもできます。

SQLデータベースと比べて、NoSQLデータベースはスケーリング化が比較的簡単で、ビッグデータの保存に適しています。

MongoDB Atlas

MongoDB Atlasとは、クラウドホスティングMongoDBサービスです。クラウド上で動かせるデータベースなので、ローカルでのデータ保存や環境構築は必要ないです。

MongoDB Atlasを実際に動かしてみる

それでは、実際にMongoDB Atlasを立ち上げます。まずは、つぎのURLからアカウント登録をしてFreeプランを選択します。

MongoDB Atlas: https://www.mongodb.com/ja-jp/atlas/database

設定はデフォルトのままにします。認証方法はユーザー名とパスワードを用いる方式を選んで、ユーザー名とパスワードを入力してください。
接続の選択は、ローカル環境を選びます。IPアドレスは便宜上、どこからでもアクセスできるよう0.0.0.0/0と設定します。

確認してみましょう。クラスター名、コレクションズの順にクリックすると、このクラスターに入ってるデータベースが表示されます。各データベースの下に、そこに入ってるコレクションも表示されています。さらに、コレクションを選ぶと、コレクションにあるドキュメントが表示されます。

mongo shell

セットアップ

mongo shellとは、MongoDBのインタラクティブJavaScriptインターフェースです。

今回はmongo shellを使って、クラウド上のデータベースに対してCRUD操作をしてみましょう。以下のリンクからOSに対応するパッケージをダウンロードしてインストールできます。

https://www.mongodb.com/try/download/communityhttps://www.mongodb.com/try/download/community

ローカルからMongoDB Atlasに接続しましょう。
コネクトをクリックして「Connect with the MongoDB Shell」を選択して「I have the MongoDB installed」を選択します。
接続用のコマンドをコピーして、コマンドラインツールやターミナルに張り付けて実行します。

パスワードを入力して接続します。dbコマンドで現在いるデータベースの名前を確認します。show dbsでクラスターに入ってるすべてのデータベースを表示してみます。

追加操作

ここからはデータベースに対してCRUD操作をしましょう。

サンプルコードは次のようになります。

use members
db.members.insertOne({name: "user1"})
db.members.insertOne({name: "user2", birth_year: 2000})
db.members.insertMany([{name: "user3", age: 23, hobby: "music"}, {name: "user4", age: 30, hobby: "running"}, {name: "user5", age: 37, hobby: "football"}])
db.members.find()

サンプルコードに沿って説明をします。

useコマンドでmembersというデータベースを新規作成します。

次に、データの追加操作を説明します。
insertOneで1つ追加のドキュメントを追加できます。また、insertManyで複数のドキュメントを1回で追加できます。

findコマンドで追加された内容を確認しましょう。findコマンドについて後ほど説明します。
表示された結果を確認しましょう。各ドキュメントの1つ目の _id というフィールドはMongoDBが自動で付与しているものです。

更新操作

続いて、更新操作を説明します。サンプルコードは次のようになります。

db.members.updateOne({name: "user3"}, {age: 24})
db.members.updateOne({name: "user3"}, {$set: {age: 24}})
db.members.updateMany({hobby: {$exists: false}}, {$set: {hobby: "no hobby"}})
db.members.find()

サンプルコードに沿って説明をします。まず、ユーザー3の年齢を24に更新する操作をしてみましょう。

updateOneで1つのドキュメントを1回で更新できます。また,updateManyで複数のドキュメントを1回で更新できます。更新操作をする時に、特定の演算子$を使う必要があります。書式はサンプルの通りになります。今回の場合はセット演算子を使います。

次に、複数のドキュメントを1回で更新してみましょう。hobbyというフィールドがないユーザーに対して、hobbyフィールドをつけて、値をNo hobbyにします。更新ができました。findコマンドで結果を確認しましょう。

検索操作

つぎに、検索操作をしましょう。サンプルコードは次のようになります。

db.members.findOne()
db.members.find().count()
db.members.find({age: {$gt: 20}})

サンプルコードに沿って説明をします。

findOneはコレクション中の条件を満たす1つ目のドキュメントを返して、findはコレクション中のドキュメントすべてを返すことができます。また、countメソッドでドキュメントの個数を数えることができます。

次に、年齢が二十歳より上という条件を満たすユーザーを検索してみましょう。演算子$と書式はサンプルの通りになります。

削除操作

最後に、削除操作を説明します。

deleteoneはコレクション中の条件を満たす1つ目のドキュメントを削除ができ、deletemanyはコレクション中の条件を満たすすべてのドキュメントを削除できます。

ユーザー1を削除してみます。コードはこのようになります。

db.members.deleteOne({name: "user1"})

次に、年齢が30歳以下のユーザーを削除してみましょう。コードはこのようになります。

db.members.deleteMany({age: {$lte: 30}})

結果を確認しましょう。

db.members.find()

正しく削除されましたね。

NodejsとMongoDB Atlas

ここからはNode.jsによるMongoDBの操作について解説します。MongoDBはPythonなどの言語で操作ができますが、MongoDBの多くの構文はそのままJavaScriptで書かれていため、MongoDBと一番相性が良いのはNode.jsです。

今回はnpmモジュールmongooseを使ってMongoDB Atlasに接続して操作をします。mongooseを使うことで、ドキュメントをオブジェクトとして扱うことができ、さらにオブジェクトに対して、MongoDBのメソッドをチェーン方式で呼び出すことができます。

MongoDB Atlasを開いて、Connectをクリック、Connect your applicationをクリック、接続用のURLをコピーして、次のように.env作成してファイルへ貼り付けます。

URL="mongodb+srv://aa:<password>@cluster0.ocjtbik.mongodb.net/?retryWrites=true&w=majority"

データベース名をmembersにして、パスワードを入れます。括弧を含めた部分を消して、代わりにパスワードを入れてください。
ここからはプログラムの解説に入ります。

全体のサンプルコードは次のようになります。

index.jsというファイルを作成して貼り付けてください。

import mongoose from "mongoose";
import "dotenv/config";

const url = process.env.URI;

mongoose
  .connect(url)
  .then((result) => {
    console.log("connected to MongoDB");
  })
  .catch((error) => {
    console.log("error connecting to MongoDB:", error.message);
  });

const Schema = mongoose.Schema;

const userSchema = new Schema({
  name: String,
  age: Number,
});

const User = mongoose.model("User", userSchema);

const user = new User({
  name: "user1",
  age: 20,
});

user.save().then(() => {
  console.log("Saved!");
  mongoose.connection.close();
});

まずnpm installコマンドでmongooseをインストールします。

npm install mongoose

つぎのように、mongooseのモジュールをインポートします。

import mongoose from "mongoose";

次に、connectメソッドで接続します。urlを引数として入れてあげます。
接続できた場合は、connected to MongoDBを出力します。エラーが出た場合は、エラーを出力します。

mongoose
  .connect(url)
  .then((result) => {
    console.log("connected to MongoDB");
  })
  .catch((error) => {
    console.log("error connecting to MongoDB:", error.message);
  });

続いて、Schemaの定義です。Schemaとは、どのようなデータをドキュメントに格納するかという定義のことです。MongoDBはSchemaレスですが、mongooseはプログラムの安全性を確保するために、しっかりSchemaを定義する必要があります。

ここでは、userSchemaというSchemaを定義して、フィールドは名前と年齢です。それぞれの型は文字列と数字です。

const Schema = mongoose.Schema;

const userSchema = new Schema({
  name: String,
  age: Number,
});

定義されたuserSchemaを使って、モデルを作成します。第一引数にはモデルの対象となるコレクションの単数形の名前を入れます。mongooseはモデル名の小文字バージョンの複数形をコレクション名にします。

今回のコレクション名はusersになります。第二引数にはSchemaを指定します。

次に、モデルからインスタンスを作成して、具体的な値を入れます。

const User = mongoose.model("User", userSchema);

const user = new User({
  name: "user1",
  age: 20,
});

最後に、saveメソッドでデータベースに保存します。保存ができたら、接続を切ります。

user.save().then(() => {
  console.log("Saved!");
  mongoose.connection.close();
});

それでは、実行して確認しましょう。

node index.js

頭文字が小文字で、複数形のusersがコレクション名になっています。
さらに、usersコレクションに保存されたデータも反映されています。

まとめ

今回は、MongoDBの基本理念と、基本的な動作方法を勉強しました。JavaScriptで操作できるDBなのでバックエンドにJavaScriptを使用する際に積極的に使ってみてください。