(Node.js)MongoDB:DocumentをJavaScriptオブジェクトに変換する


![]
APIを迅速かつ簡単に開発する際には、Node.js + Express.js + mongoDB の組合せがよく用いられる.また、MongoDB ODM(オブジェクトドキュメントマッピング)mongooseを使用してデータベースを管理します.
mongoseを使用してデータをクエリーし、json形式に変換してすぐに応答を送信する場合は問題ありませんが、データを拡散演算子やユニットテストに分解すると、望ましくないデータが含まれていることがよくあります.

予想どおりの様子

{
    "name": "hodoopapa",
    "position": "개발자",
    "roles": [
      "ADMIN"
    ]
}

じつそう

{
  "$__": {
    "$options": {
      "defaults": true
    },
    "$setCalled": {},

    // ... (생략)

    "backup": {
      "activePaths": {
        "default": {
          "_id": true
        },
        "modify": {
          "name": true,
          "position": true,
          "roles": true
        }
      }
    },
    "cachedRequired": {},

    // ... (생략)

    "getters": {},
    "inserting": true,
    "pathsToScopes": {
      "roles": "[Circular reference found] Truncated by IDE"
    },
    "session": null,
    "strictMode": true,
    "validating": null,
    "wasPopulated": false
  },
  "$locals": {},
  "$op": null,
  "_doc": {
    "__v": 0,
    "_id": "[Circular reference found] Truncated by IDE",
    "name": "hodoopapa",
    "position": "개발자",
    "roles": [
      "ADMIN"
    ]
  },
  "isNew": false
}

Mongoose Document


Mongoose Queryで検索したデータは簡単なPlain Old JavaScriptオブジェクト(POJO)ではなく、Mongoose Document形式なので.
Mongoose Documentには、次の内容が含まれています.
  • Changing tracking
  • Casting and validation
  • Getters and Setters
  • Virtual
  • save()
  • 追加の情報とメソッドが含まれているので、Query結果値を使用して変更し、save()メソッドで変更内容をDBに反映することができます.
    const findAndUpdateName = async (oldName, newName) => {
      const user = await User.findOne({ name: oldName });
      user.name = newName;
      const savedUser = await user.save();
      
     return savedUser;

    Plain Old JavaScript Object(POJO)


    他の情報やメソッドを使用しない場合は、Mongoose Documentを使用する必要はありません.したがって、一般的にtoObject()の方法でPOJOに変換して使用される.
    これよりも効果的な方法があります.それはlean()方法です.toObject()メソッドを使用する場合は、Query結果をMongoose Documentに変換してからPOJOに変換しますが、lean()メソッドを使用する場合は、中間プロセスを必要とせずにPOJOに戻ります.

    toObject()メソッドの使用

    const findbyName = async (name) => {
      const user = await User.findOne({ name });
      	return user.toObject();
    };

    lean()メソッドの使用

    const findByName = async (name) => {
      const user = await User.findOne({ name }).lean();
    	return user;
    };

    lean()メソッドの使用

    lean()個のメッセージを用いて得られたデータはMongoose Documentではないため,付加情報やsave()などの方法は利用できない.そのため、以下の場合に使用することをお勧めします.
  • Express応答のように、何の変更もなしにQuery結果を直接送信:
  • Query結果を変更せずにカスタムgetterを使用しない場合、
  • リファレンス

  • Faster Mongoose Queries With Lean