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トピックページで演習とプログラミングプロジェクトを確認してください。