MongooseおよびMongoDBAtlasを使用してCRUD操作を実行する方法
序章
Mongoose は、Node.jsおよびMongoDBバックエンドのデータを操作するための基本的なツールの1つです。
この記事では、 MongoDBAtlasリモートデータベースでのMongooseの使用について検討します。 このチュートリアルの例は、食品とそのカロリー値のリストで構成されます。 ユーザーは、新しいアイテムの作成、アイテムの読み取り、アイテムの更新、およびアイテムの削除を行うことができます。
前提条件
- サーバーでのExpressの使用に精通していること。 Expressに関するこの記事とExpressの公式ドキュメントを参照できます。
- 認証なしでRESTAPIを設定する知識。 Express を使用したルーティングについてはこの記事を、非同期と待機についてはこの記事を参照してください。
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
次に、expressとmongooseをインストールします。
npm install [email protected] [email protected]
この時点で、expressとmongooseを使用した新しいプロジェクトが作成されます。
ステップ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()は、接続文字列と構成オプションのオブジェクトを受け取ります。 このチュートリアルでは、非推奨の警告を回避するために、useNewUrlParser、useFindAndModify、および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を定義します。 タイプStringのname値で構成され、required、trim任意の空白になり、lowercaseに設定されます。 ]文字。 また、タイプNumberのcalories値で構成され、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に設定されていることを確認してください。 リクエストURLをlocalhost:3000/foodsに設定します。 そして、送信をクリックします。
注:リクエストのためにPostmanインターフェースをナビゲートするための支援が必要な場合は、公式ドキュメントを参照してください。
Postmanの結果には、空の配列が表示されます。
ステップ5—ルートの作成を構築する
次に、新しい食品を作成してデータベースに保存する機能を構築します。
foodRoutes.jsファイルに再度アクセスし、app.getとmodule.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に設定されていることを確認してください。 リクエストURLをlocalhost:3000/foodに設定します。
Body セクションで、rawとJSONを選択します。 次に、nameとcaloriesを使用してJSONオブジェクトを作成し、新しい食品を追加します。
{
"name": "cotton candy",
"calories": 100
}
新しい食べ物の作成リクエストを送信した後、すべての食べ物を読むリクエストをもう一度送信します。 Postmanの結果には、新しく追加されたオブジェクトが表示されます。
ステップ6—更新ルートを構築する
Mongooseで作成されたすべてのオブジェクトには、独自の_idが与えられ、これを使用して特定のアイテムをターゲットにすることができます。 アルファベットと文字を組み合わせたものになります。 例:5d1f6c3e4b0b88fb1d257237。
次に、既存の食品を更新し、変更をデータベースに保存する機能を構築します。
foodRoutes.jsファイルに再度アクセスし、app.postとmodule.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に設定されていることを確認してください。 リクエストURLをlocalhost:3000/food/<id>に設定します。ここで、idは以前に作成した食品の識別文字列です。
Body セクションで、rawとJSONを選択します。 次に、nameとcaloriesを使用してJSONオブジェクトを作成し、食品を変更します。
{
"calories": "999"
}
Update Food リクエストを送信した後、 Read AllFoodリクエストを再度送信します。 Postmanの結果には、caloriesが変更されたオブジェクトが表示されます。
ステップ7—削除ルートを構築する
最後に、既存の食品を削除して変更をデータベースに保存する機能を構築します。
foodRoutes.jsファイルに再度アクセスし、app.patchとmodule.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に設定されていることを確認してください。 リクエストURLをlocalhost:3000/food/<id>に設定します。ここで、idは以前に作成した食品の識別文字列です。
食品の削除リクエストを送信した後、すべての食品の読み取りリクエストを再度送信します。 Postmanの結果には、削除されたアイテムのない配列が表示されます。
注:このチュートリアルを完了したので、使用しなくなったMongoDBAtlasクラスターを終了することができます。
この時点で、Mongooseメソッドを使用してMongoDBAtlasクラスターと対話するExpressサーバーができました。
結論
この記事では、バックエンドデータをすばやく作成および管理できるMongooseメソッドの使用方法を学習しました。
Node.jsの詳細については、Node.jsトピックページで演習とプログラミングプロジェクトを確認してください。
MongoDBの詳細については、MongoDBトピックページで演習とプログラミングプロジェクトを確認してください。