MongooseおよびMongoDBAtlasを使用してCRUD操作を実行する方法

提供:Dev Guides
移動先:案内検索

序章

Mongoose は、Node.jsおよびMongoDBバックエンドのデータを操作するための基本的なツールの1つです。

この記事では、 MongoDBAtlasリモートデータベースでのMongooseの使用について検討します。 このチュートリアルの例は、食品とそのカロリー値のリストで構成されます。 ユーザーは、新しいアイテムの作成、アイテムの読み取り、アイテムの更新、およびアイテムの削除を行うことができます。

前提条件

APIエンドポイントのテストには、Postmanなどのツールをダウンロードしてインストールすることをお勧めします。

このチュートリアルは、Node v15.3.0、npm v7.4.0、express v4.17.1、mongoose v5.11.12、およびMongoDBv4.2で検証されました。

MongoDBAtlasのセットアップ

このプロジェクトには、 MongoDBAtlasアカウントも必要です。

アカウントを作成してサインインした後、次の手順に従って、無料利用枠クラスターをデプロイします。

クラスタ、データベースユーザー、およびIPアドレスを設定すると、プロジェクトの残りの部分を設定するときに、後で接続文字列を取得する準備が整います。

ステップ1—プロジェクトの設定

このセクションでは、プロジェクトのディレクトリを作成し、依存関係をインストールします。

プロジェクトの新しいディレクトリを作成します。

mkdir mongoose-mongodb-atlas-example

新しく作成されたディレクトリに移動します。

cd mongoose-mongodb-atlas-example

この時点で、新しいnpmプロジェクトを初期化できます。

npm init -y

次に、expressmongooseをインストールします。

npm install [email protected] [email protected]

この時点で、expressmongooseを使用した新しいプロジェクトが作成されます。

ステップ2—サーバーのセットアップ

このセクションでは、Expressサーバーを実行し、MongoDB Atlasデータベースに接続し、将来のルートをインポートするための新しいファイルを作成します。

新しいserver.jsファイルを作成し、次のコード行を追加します。

server.js

const express = require("express");
const mongoose = require("mongoose");
const foodRouter = require("./routes/foodRoutes.js");

const app = express();

app.use(express.json());

mongoose.connect(
  "mongodb+srv://madmin:<password>@clustername.mongodb.net/<dbname>?retryWrites=true&w=majority",
  {
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true
  }
);

app.use(foodRouter);

app.listen(3000, () => {
  console.log("Server is running...");
});

接続文字列に注意してください。 これは、MongoDBAtlasによって提供される接続文字列です。 管理者アカウント(madmin)、パスワード、クラスター名(clustername)、およびデータベース名(dbname)を、クラスターに関連する値に置き換える必要があります。 :

mongodb+srv://madmin:<password>@clustername.mongodb.net/<dbname>?retryWrites=true&w=majority

mongoose.connect()は、接続文字列と構成オプションのオブジェクトを受け取ります。 このチュートリアルでは、非推奨の警告を回避するために、useNewUrlParseruseFindAndModify、およびuseUnifiedTopologyの構成設定が必要です。

この時点で、Expressサーバーが起動します。 次に、スキーマを定義し、ルートを処理する必要があります。

ステップ3—スキーマの構築

まず、データを構造化するためのパターンが必要になります。これらのパターンはスキーマと呼ばれます。 スキーマを使用すると、必要なデータと、データにオブジェクトとして含めるオプションを正確に決定できます。

このチュートリアルでは、mongoose.modelメソッドを使用して実際のデータで使用できるようにし、foodRoutes.jsで使用できる変数としてエクスポートします。

新しいmodelsディレクトリを作成します。

mkdir models

この新しいディレクトリ内に、新しいfood.jsファイルを作成し、次のコード行を追加します。

./models/food.js

const mongoose = require("mongoose");

const FoodSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true,
    lowercase: true,
  },
  calories: {
    type: Number,
    default: 0,
    validate(value) {
      if (value < 0) throw new Error("Negative calories aren't real.");
    },
  },
});

const Food = mongoose.model("Food", FoodSchema);

module.exports = Food;

このコードは、FoodSchemaを定義します。 タイプStringname値で構成され、requiredtrim任意の空白になり、lowercaseに設定されます。 ]文字。 また、タイプNumbercalories値で構成され、defaultは0になり、validateは負の数がないことを確認します。提出されました。

ステップ4—読み取りルートを構築する

データモデルを設定したら、それを使用するためのルートの設定を開始できます。 これは、Mongooseを通じて利用可能なさまざまなクエリ関数を利用します。

データベース内のすべての食品を読むことから始めます。 この時点で、それは空の配列になります。

新しいroutesディレクトリを作成します。

mkdir routes

この新しいディレクトリ内に、新しいfoodRoutes.jsファイルを作成し、次のコード行を追加します。

./routes/foodRoutes.js

const express = require("express");
const foodModel = require("../models/food");
const app = express();

app.get("/foods", async (request, response) => {
  const foods = await foodModel.find({});

  try {
    response.send(foods);
  } catch (error) {
    response.status(500).send(error);
  }
});

module.exports = app;

このコードは、GETリクエストの/foodsエンドポイントを確立します(複数形の「s」に注意してください)。 マングースクエリ関数find()は、パラメータが一致するすべてのオブジェクトを返します。 パラメータが指定されていないため、データベース内のすべてのアイテムが返されます。

Mongoose関数は非同期であるため、async/awaitを使用します。 データを取得すると、このコードはtry/catchブロックを使用してデータを送信します。 これは、Postmanでデータを確認するのに役立ちます。

プロジェクトディレクトリのルートに移動し、ターミナルで次のコマンドを使用してExpressサーバーを実行します。

node server.js

Postmanで、新しい Read AllFoodリクエストを作成します。 リクエストタイプがGETに設定されていることを確認してください。 リクエストURLlocalhost:3000/foodsに設定します。 そして、送信をクリックします。

:リクエストのためにPostmanインターフェースをナビゲートするための支援が必要な場合は、公式ドキュメントを参照してください。


Postmanの結果には、空の配列が表示されます。

ステップ5—ルートの作成を構築する

次に、新しい食品を作成してデータベースに保存する機能を構築します。

foodRoutes.jsファイルに再度アクセスし、app.getmodule.exportsの間に次のコード行を追加します。

./routes/foodRoutes.js

// ...

app.post("/food", async (request, response) => {
  const food = new foodModel(request.body);

  try {
    await food.save();
    response.send(food);
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

このコードは、POSTリクエストの/foodエンドポイントを確立します。 マングースクエリ関数.save()は、渡されたデータをデータベースに保存するために使用されます。

Postmanで、 Create NewFoodという新しいリクエストを作成します。 リクエストタイプがPOSTに設定されていることを確認してください。 リクエストURLlocalhost:3000/foodに設定します。

Body セクションで、rawJSONを選択します。 次に、namecaloriesを使用してJSONオブジェクトを作成し、新しい食品を追加します。

{
  "name": "cotton candy",
  "calories": 100
}

新しい食べ物の作成リクエストを送信した後、すべての食べ物を読むリクエストをもう一度送信します。 Postmanの結果には、新しく追加されたオブジェクトが表示されます。

ステップ6—更新ルートを構築する

Mongooseで作成されたすべてのオブジェクトには、独自の_idが与えられ、これを使用して特定のアイテムをターゲットにすることができます。 アルファベットと文字を組み合わせたものになります。 例:5d1f6c3e4b0b88fb1d257237

次に、既存の食品を更新し、変更をデータベースに保存する機能を構築します。

foodRoutes.jsファイルに再度アクセスし、app.postmodule.exportsの間に次のコード行を追加します。

./routes/foodRoutes.js

// ...

app.patch("/food/:id", async (request, response) => {
  try {
    await foodModel.findByIdAndUpdate(request.params.id, request.body);
    await foodModel.save();
    response.send(food);
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

このコードは、PATCHリクエストの/food/:idエンドポイントを確立します。 Mongooseクエリ関数.findByIdAndUpdate()は、ターゲットのidとそれを置き換えるリクエストデータを取得します。 次に、.save()を使用して変更を保存します。

Postmanで、 UpdateFoodという新しいリクエストを作成します。 リクエストタイプがPATCHに設定されていることを確認してください。 リクエストURLlocalhost:3000/food/<id>に設定します。ここで、idは以前に作成した食品の識別文字列です。

Body セクションで、rawJSONを選択します。 次に、namecaloriesを使用してJSONオブジェクトを作成し、食品を変更します。

{
  "calories": "999"
}

Update Food リクエストを送信した後、 Read AllFoodリクエストを再度送信します。 Postmanの結果には、caloriesが変更されたオブジェクトが表示されます。

ステップ7—削除ルートを構築する

最後に、既存の食品を削除して変更をデータベースに保存する機能を構築します。

foodRoutes.jsファイルに再度アクセスし、app.patchmodule.exportsの間に次のコード行を追加します。

./routes/foodRoutes.js

// ...

app.delete("/food/:id", async (request, response) => {
  try {
    const food = await foodModel.findByIdAndDelete(request.params.id);

    if (!food) response.status(404).send("No item found");
    response.status(200).send();
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

このコードは、DELETEリクエストの/food/:idエンドポイントを確立します。 マングースクエリ関数.findByIdAndDelete()は、ターゲットのidを取得し、それを削除します。

Postmanで、 DeleteFoodという新しいリクエストを作成します。 リクエストタイプがDELETEに設定されていることを確認してください。 リクエストURLlocalhost:3000/food/<id>に設定します。ここで、idは以前に作成した食品の識別文字列です。

食品の削除リクエストを送信した後、すべての食品の読み取りリクエストを再度送信します。 Postmanの結果には、削除されたアイテムのない配列が表示されます。

注:このチュートリアルを完了したので、使用しなくなったMongoDBAtlasクラスターを終了することができます。


この時点で、Mongooseメソッドを使用してMongoDBAtlasクラスターと対話するExpressサーバーができました。

結論

この記事では、バックエンドデータをすばやく作成および管理できるMongooseメソッドの使用方法を学習しました。

Node.jsの詳細については、Node.jsトピックページで演習とプログラミングプロジェクトを確認してください。

MongoDBの詳細については、MongoDBトピックページで演習とプログラミングプロジェクトを確認してください。