当前位置: 首页 > 面试题库 >

需要建议使用mongoose在mongodb中设计数据库

逑禄
2023-03-14
问题内容

我有2个馆藏:医院和患者。本月患者在医院A进行检查,但是下个月,该患者在医院B进行检查。那么在更新患者信息时,如何保存患者已经在医院A进行检查的患者病史?请给我个建议吗?谢谢


问题答案:

您需要为此准备单独的检查集。(就像关系数据库中的中间(关联)表一样。)

解决此问题的一种方法是使用虚拟填充。使用虚拟填充,我们无需保留对考试的引用,这将简化添加,更新或删除考试时的操作。因为只需要更新考试集。

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);

inspection.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:所有这些类:,以及其他- 。 想法1:需要通过接口或抽象类对此类进行逻辑绑定。 第2点:我看到,所有实体类都有相同的方法:和。 想法2:需要避免在所有类中声明此方法。 我的解决方案: 添加界

  • 本文向大家介绍Node.js 使用Mongoose和Express.js路由在MongoDB中查找数据,包括了Node.js 使用Mongoose和Express.js路由在MongoDB中查找数据的使用技巧和注意事项,需要的朋友参考一下 示例 设定 首先,使用以下命令安装必要的软件包: 代码 然后,将依赖项添加到server.js,创建数据库模式和集合名称,创建Express.js服务器,并连接

  • 我有一个场景,其中我得到一个String消息列表,我必须遍历String并调用另一个方法,这是一个长时间运行的过程。然后我必须收集这个长时间运行过程的结果并连接结果并将其发送回用户交互界面。我对Scala中的这些未来概念很陌生。我正在使用Play框架,其中字符串列表将来自用户交互界面。这是我第一次尝试实现ht场景的样子: 为简单起见,long RunningCall将只返回一个字符串。稍后我将把它

  • 问题内容: 我有一个简单的应用程序,说它有一些类和一个“额外的”类来处理数据库请求。目前,每次使用该应用程序时,我都会创建数据库对象,但是在某些情况下,不需要数据库连接。我正在这样做(PHP btw): 但是有时对象不需要数据库访问,因为仅调用没有数据库操作的方法。所以我的问题是:处理这样的情况的专业方法是什么/如何仅在需要时才创建数据库连接/对象? 我的目标是避免不必要的数据库连接。 问题答案:

  • 我有一个/应用程序。我使用来处理MongoDB的操作。我已经将MongoDB连接字符串存储在文件中,连接到数据库的文件如下所示, 我有一个登录路线,像每一个其他的应用程序和一切工作完美地在本地。由于它在本地运行得非常好,我决定在一个类似于生产的环境中进行测试。 为了使其生产准备就绪,我手动创建了数据库并创建了用户,并使用该用户在集合中插入了一个文档。此文档包含我登录应用程序所需的数据。我已经在Di

  • 问题内容: 是否可以选择使用猫鼬进行批量更新?所以基本上有一个数组,如果不存在则插入每个元素,如果存在则更新它?(我正在使用海关_ids) 当我确实使用 .insert时, MongoDB对于重复的密钥(应更新)返回错误E11000。插入多个新文档可以正常工作: 使用 .save 返回错误,该参数必须是单个文档: 这个答案表明没有这样的选择,但是它是针对C#的,并且已经使用了3年。所以我想知道是否