sql >> データベース >  >> NoSQL >> MongoDB

マングースを使用してmongodbでデータベースを設計するためのアドバイスが必要です

    これには、個別の検査コレクションが必要です(リレーショナルデータベースの中間(連想)テーブルのようなものです)。

    これを解決する1つの方法は、仮想入力を使用することです。仮想入力を使用すると、検査への参照を保持する必要がないため、検査を追加、更新、または削除するときに作業が簡素化されます。検査コレクションのみを更新する必要があるためです。

    patient.js

    const mongoose = require("mongoose");
    
    const patientSchema = new mongoose.Schema(
      {
        name: String
      },
      {
        toJSON: { virtuals: true }
      }
    );
    
    // Virtual populate
    patientSchema.virtual("examinations", {
      ref: "Examination",
      foreignField: "patientId",
      localField: "_id"
    });
    
    module.exports = mongoose.model("Patient", patientSchema);
    

    Hospital.js

    const mongoose = require("mongoose");
    
    const hospitalSchema = new mongoose.Schema(
      {
        name: String
      },
      {
        toJSON: { virtuals: true }
      }
    );
    
    // Virtual populate
    hospitalSchema.virtual("examinations", {
      ref: "Examination",
      foreignField: "hospitalId",
      localField: "_id"
    });
    
    module.exports = mongoose.model("Hospital", hospitalSchema);
    

    Examination.js

    const mongoose = require("mongoose");
    
    const examinationSchema = new mongoose.Schema({
      when: {
        type: Date,
        default: Date.now()
      },
      patientId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Patient"
      },
      hospitalId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Hospital"
      }
    });
    
    module.exports = mongoose.model("Examination", examinationSchema);
    

    ご覧のとおり、患者と病院のスキーマは、検査の参照がなくても非常にクリーンです。

    これらの既存の患者を抱えましょう。

    {
        "_id" : ObjectId("5e0f86d0ea3eb831a4845064"),
        "name" : "Patient 1",
        "__v" : NumberInt(0)
    },
    {
        "_id" : ObjectId("5e0f86dbea3eb831a4845065"),
        "name" : "Patient 2",
        "__v" : NumberInt(0)
    }
    

    これらの既存の病院を作りましょう。

    {
        "_id" : ObjectId("5e0f86feea3eb831a4845066"),
        "name" : "Hospital 1",
        "__v" : NumberInt(0)
    },
    {
        "_id" : ObjectId("5e0f8705ea3eb831a4845067"),
        "name" : "Hospital 2",
        "__v" : NumberInt(0)
    }
    

    これらの既存の試験を受けましょう。

    /* Patient 1 - Hospital 1 */
    {
        "when": "2020-01-03T18:27:12.997Z",
        "_id": "5e0f878346e50d41d846d482",
        "patientId": "5e0f86d0ea3eb831a4845064",
        "hospitalId": "5e0f86feea3eb831a4845066",
        "__v": 0
    },
    /* Patient 1 - Hospital 1 */
    {
        "when": "2020-01-03T18:27:12.997Z",
        "_id": "5e0f87a646e50d41d846d483",
        "patientId": "5e0f86d0ea3eb831a4845064",
        "hospitalId": "5e0f86feea3eb831a4845066",
        "__v": 0
    },
    /* Patient 1 - Hospital 2*/
    {
        "when": "2020-01-03T18:27:12.997Z",
        "_id": "5e0f87c446e50d41d846d484",
        "patientId": "5e0f86d0ea3eb831a4845064",
        "hospitalId": "5e0f8705ea3eb831a4845067",
        "__v": 0
    },
    /* Patient 2 - Hospital 1 */
    {
        "when": "2020-01-03T18:27:12.997Z",
        "_id": "5e0f87e046e50d41d846d485",
        "patientId": "5e0f86dbea3eb831a4845065",
        "hospitalId": "5e0f86feea3eb831a4845066",
        "__v": 0
    }
    

    これで、患者とその検査の情報を取得したい場合は、次のコードを使用できます。

    app.get("/patients/:id", async (req, res) => {
      const result = await Patient.findById(req.params.id).populate("examinations");
      res.send(result);
    });
    

    結果は次のようになります:

    {
        "_id": "5e0f86d0ea3eb831a4845064",
        "name": "Patient 1",
        "__v": 0,
        "examinations": [
            {
                "when": "2020-01-03T18:27:12.997Z",
                "_id": "5e0f878346e50d41d846d482",
                "patientId": "5e0f86d0ea3eb831a4845064",
                "hospitalId": "5e0f86feea3eb831a4845066",
                "__v": 0
            },
            {
                "when": "2020-01-03T18:27:12.997Z",
                "_id": "5e0f87a646e50d41d846d483",
                "patientId": "5e0f86d0ea3eb831a4845064",
                "hospitalId": "5e0f86feea3eb831a4845066",
                "__v": 0
            },
            {
                "when": "2020-01-03T18:27:12.997Z",
                "_id": "5e0f87c446e50d41d846d484",
                "patientId": "5e0f86d0ea3eb831a4845064",
                "hospitalId": "5e0f8705ea3eb831a4845067",
                "__v": 0
            }
        ],
        "id": "5e0f86d0ea3eb831a4845064"
    }
    

    このように病院に内部人口を追加することもできます:

    app.get("/patients/:id", async (req, res) => {
      const result = await Patient.findById(req.params.id).populate({
        path: "examinations",
        populate: {
          path: "hospitalId"
        }
      });
    
      res.send(result);
    });
    

    結果には病院情報が含まれます:

    {
        "_id": "5e0f86d0ea3eb831a4845064",
        "name": "Patient 1",
        "__v": 0,
        "examinations": [
            {
                "when": "2020-01-03T18:27:12.997Z",
                "_id": "5e0f878346e50d41d846d482",
                "patientId": "5e0f86d0ea3eb831a4845064",
                "hospitalId": {
                    "_id": "5e0f86feea3eb831a4845066",
                    "name": "Hospital 1",
                    "__v": 0,
                    "id": "5e0f86feea3eb831a4845066"
                },
                "__v": 0
            },
            {
                "when": "2020-01-03T18:27:12.997Z",
                "_id": "5e0f87a646e50d41d846d483",
                "patientId": "5e0f86d0ea3eb831a4845064",
                "hospitalId": {
                    "_id": "5e0f86feea3eb831a4845066",
                    "name": "Hospital 1",
                    "__v": 0,
                    "id": "5e0f86feea3eb831a4845066"
                },
                "__v": 0
            },
            {
                "when": "2020-01-03T18:27:12.997Z",
                "_id": "5e0f87c446e50d41d846d484",
                "patientId": "5e0f86d0ea3eb831a4845064",
                "hospitalId": {
                    "_id": "5e0f8705ea3eb831a4845067",
                    "name": "Hospital 2",
                    "__v": 0,
                    "id": "5e0f8705ea3eb831a4845067"
                },
                "__v": 0
            }
        ],
        "id": "5e0f86d0ea3eb831a4845064"
    }
    

    この知識があれば、病院側から取得操作を自分で実装できます。



    1. MongoDBで全文検索を行う方法

    2. node.js mongodb_idnode-mongodb-nativeでドキュメントを選択

    3. 集計$lookup一致するパイプライン内のドキュメントの合計サイズが最大ドキュメントサイズを超えています

    4. MongoError:フィルターパラメーターはオブジェクトである必要があります