[MongoDB] Node.js mongoseを使ったCRUD


https://velog.io/@limsw/MongoDB-Mongose-モードおよび-構成-および-APIの使用例
対応する位置はNodeこれはjs mongoseを用いてMongoDBを処理する最後の文章です.この記事では、MongoDB CRUDの例について説明します.アーキテクチャやモデルを定義していない人は、上記の記事を参照してください.

緒論


前記事では、find()メソッドを使用したクエリー機能と、save()メソッドを使用してドキュメントを格納した例を見ました.
今回のCRUDでは、以下の内容について説明します.
  • find()メソッドに条件を追加して行う前処理ドキュメント照会
  • findOne()使用方法の単一データ照会
  • 修正案後文書保存時に検証名を繰り返す
  • update()使い方修正文書
  • remove()使い方ドキュメント削除
  • Read機能の実装


    コレクション内のデータは、次の状態で行われます.

    find()メソッドへの条件の追加


    まず、find()メソッドに条件を追加するには、次のコードを変更します.
    // 기존 코드 : 모든 Document 조회하기
    router.get('', (req, res, next) => {
        
        User.find().then((result) => {
            res.json(result);
        }).catch((err) => {
            res.send(err);
        });
    });
    
    // 수정된 코드 : 성별이 male인 Document 조회하기
    router.get('', (req, res, next) => {
        
        User.find({sex: "male"}).then((result) => {
            res.json(result);
        }).catch((err) => {
            res.send(err);
        });
    });
    find()メソッドに条件を追加するため、{}に条件を追加できます.これはポストマンで見た結果です.上図のように、2つの性別が男性のDocumentを返していることが確認できます.

    findOne()メソッドを使用して単一のデータを表示する

    findOne()メソッドは、前処理データの最上位レベルのデータを返すメソッドである.
    router.get('', (req, res, next) => {
        
        User.findOne({sex: "male"}).then((result) => {
            res.json(result);
        }).catch((err) => {
            res.send(err);
        });
    });
    以上のように、既存のfind()関数をfindOne()関数に変更してGET要求を出したらどうなりますか?上位データが1個しか確認できない.

    Create機能の変更


    現在のアーキテクチャでは重複処理が行われていないため、同じドキュメントを保存しても問題はありません.ただし、実際のプロジェクトを実施する場合は、Eメールなどのユーザー情報が重複しないことを確認してください.
    筆者のシナリオには現在電子メールフィールドがないため,重複を避けるためにシナリオの修正を決定した.
    したがって、現在のアーキテクチャにおけるnameフィールドの重複を避けるために、フィールドに対して以下の変更を加えることができる.
    // user.js
    const userSchema = mongoose.Schema({
        name: {
            type: String,
            maxlength: 50,
            unique: true, // 해당 부분 추가
        },
        password: {
            type: String,
            minlength: 7,
        },
        sex: {
    	    type: String,
        }
    });
    nameオプションを追加することで、このフィールドをユニークに指定します.
    これで、既存のname値と同じ値を使用してPOSTリクエストを送信できます.
    400 Bad Requestエラーが返される.エラーを表示すると、nameの値が重複していると判断できますunique.

    Documentの変更


    文書の修正にはlimメソッドを使用します.
    コードは次のように整理できます.
    router.patch('', (req, res, next) => {
        User.update({name: "lim"}, {name: "limsw"})
        .then((result) => {res.json(result)})
        .catch((err) => {res.json(err)});
    });
    update()メソッドは2つのパラメータを受け入れ、1つ目は条件、2つ目は変更するデータを示す.筆者は,nameの値でlim付きDocumentを検索し,そのDocumentのnameをlimswに変更した.update()PATCHリクエスト送信
    要求の実行が良好であることが確認できる.結果は以下の通りです.
    データも可能localhost:3000/userユーザー定義通りに良く変更されたか確認します.

    Documentの削除


    ドキュメントの削除にはlimswメソッドを使用します.
    サンプルコードは次のとおりです.
    router.delete('', (req, res, next) => {
        User.remove({name: "limsw"})
        .then((result) => res.json(result))
        .catch((err) => res.json(err));
    });
    remove()の因子を条件として、該当するデータを削除します.
    現在remove()deleteリクエストを送信
    確認できるリクエストがうまくいっているドキュメントも2つに減っている.

    remove()メソッドを使用する際の注意点


    条件を指定すると、複数の条件を満たすドキュメントがある場合は、これらのドキュメントはすべて削除されます.
    例えば、筆者のデータには、性別が45,67914の文書が100名ある場合、このように条件を設定すると、100個の文書が削除される可能性があるので注意が必要である.

    番外-Mongose CRUDfunctions


    https://www.geeksforgeeks.org/mongoose-find-function/?ref=lbp
    このアドレスのlocalhost:3000/userラベルページでは、Mongooseが提供するCRUDメソッドと例がよく定義されているので、様々なロジックを記述したい場合は、上記のサイトを参照してください.