Querier

TypeScriptとMongooseを使用したMongoDBデータ操作完全ガイド

2023.07.12に公開 | 2023.07.12に更新

Querier運営

@querier_io@querierinc

「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。

管理画面の構築もWeb上で完結
エンジニアのためのローコードツール

Querierについて詳しく見る

今回は、TypeScriptでMongoDBのデータ操作を行う方法について詳しく解説していきます。

この記事では、具体的にはMongoDBのデータ取得や、データの追加、更新、削除などの操作を行う方法を、Mongooseというライブラリを用いて紹介します。

セットアップ

まずはMongooseとTypeScriptのインストールから始めます。

$ npm install mongoose
$ npm install @types/mongoose

続いて、MongoDBのクライアントを生成します。

import mongoose from 'mongoose';

mongoose.connect('mongodb://localhost/test', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

詳しくは、Mongoose公式ドキュメントをご参照ください。

スキーマとモデルの作成

MongoDBではスキーマとモデルを使ってデータの形を定義します。

以下に一例を示します。

import mongoose, { Schema, Document } from 'mongoose';

interface IUser extends Document {
  name: string;
  email: string;
  password: string;
}

const UserSchema: Schema = new Schema({
  name: { type: String, required: true },
  email: { type: String, required: true },
  password: { type: String, required: true }
});

export default mongoose.model<IUser>('User', UserSchema);

スキーマとモデルの作成については、こちらの公式ドキュメントをご覧ください。

データの取得

findOne

findOneメソッドを使用すると、指定した条件に一致する最初のドキュメントを取得できます。

const user = await User.findOne({ email: 'test@example.com' });
console.log(user);

詳細はこちらの公式ドキュメントをご覧ください。

find

findメソッドを使用すると、指定した条件に一致するすべてのドキュメントを取得できます。

const users = await User.find({ name: 'John Doe' });
console.log(users);

詳細はこちらの公式ドキュメントをご覧ください。

ページングを実装する

MongoDBのページング機能を利用すると、大量のデータから一部を取得することができます。

以下にskipとlimitを使用した一例を示します。

const pageNo = 2;
const size = 10;
const users = await User.find()
                .skip(size * (pageNo - 1))
                .limit(size);

詳細はこちらの公式ドキュメントをご覧ください。

データの追加

save

Mongooseでは新たに作成したモデルのインスタンスをsaveメソッドで保存することができます。

const user = new User({
  name: 'John Doe',
  email: 'john@example.com',
  password: 'password123'
});

await user.save();

詳細はこちらの公式ドキュメントをご覧ください。

insertMany

複数のドキュメントを一度に追加するにはinsertManyを使用します。

await User.insertMany([
  { name: 'Alice', email: 'alice@example.com', password: 'password123' },
  { name: 'Bob', email: 'bob@example.com', password: 'password123' }
]);

詳細はこちらの公式ドキュメントをご覧ください。

データの更新

update

特定のドキュメントを更新するにはupdateメソッドを使用します。

await User.update({ name: 'Alice' }, { $set: { email: 'newalice@example.com' } });

詳細はこちらの公式ドキュメントをご覧ください。

updateMany

複数のドキュメントを一度に更新するにはupdateManyメソッドを使用します。

await User.updateMany({ name: { $in: ['Alice', 'Bob'] } }, { $set: { password: 'newpassword123' } });

詳細はこちらの公式ドキュメントをご覧ください。

findOneAndUpdate

特定のドキュメントを見つけて更新するには、findOneAndUpdateメソッドを使用します。

await User.findOneAndUpdate({ name: 'Alice' }, { $set: { email: 'newalice@example.com' } });

詳細はこちらの公式ドキュメントをご覧ください。

データの削除

deleteOne

特定のドキュメントを削除するにはdeleteOneメソッドを使用します。

await User.deleteOne({ email: 'newalice@example.com' });

詳細はこちらの公式ドキュメントをご覧ください。

deleteMany

複数のドキュメントを一度に削除するにはdeleteManyメソッドを使用します。

await User.deleteMany({ name: { $in: ['Alice', 'Bob'] } });

詳細はこちらの公式ドキュメントをご覧ください。

7. トランザクション処理

MongooseはMongoDBのトランザクションもサポートしています。

const session = await mongoose.startSession();
session.startTransaction();
try {
  const user1 = await User.findOneAndUpdate({ name: 'Alice' }, { $inc: { balance: -100 } }, { session });
  const user2 = await User.findOneAndUpdate({ name: 'Bob' }, { $inc: { balance: 100 } }, { session });

  if (!user1 || !user2) throw new Error('Operation failed');

  await session.commitTransaction();
} catch (error) {
  await session.abortTransaction();
} finally {
  session.endSession();
}

詳細はこちらの公式ドキュメントをご覧ください。

さいごに

以上が、TypeScriptとMongooseを使ってMongoDBのデータ操作を行う方法についての解説です。

データベースの操作は、アプリケーション開発において非常に重要な部分であり、この記事が皆さんの開発の助けになれば幸いです。

「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。

最新の記事

2〜3ヶ月と見積もっていた開発期間を、クエリアを導入することでわずか1週間に短縮できました

2012年5月創業のフルカイテン株式会社。 「在庫をフル回転させる」をコンセプトに、機械学習を駆使したSaaS『FULL KAITEN』を提供し、在庫問題の解決に取り組む。

more

管理画面の構築もWeb上で完結
エンジニアのためのローコードツール

Querierについて詳しく見る