我正在使用MEAN堆栈构建一个CRUD应用程序。
我有一个patients
架构,我需要为这些病人添加一个medical history
,我想知道我是否可以使用像mysql中的“join”来关联这些文档。如果是,即使在患者被删除后,我怎么能保持medical history
。
这是我的patient
架构
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var paciente_schema = new Schema({
nombre: {type: String, required: true},
estado: {type: String, required: true, default: "En espera"},
fecha: {type: String, required: true},
edad: {type: String, required: true},
sexo: {type: String, required: true},
direccion: {type: String, required: true},
contacto: {type: String, required: true}
});
module.exports = mongoose.model("Paciente", paciente_schema);
App.js
var express = require("express");
var bodyParser = require("body-parser");
var mongoose = require("mongoose");
var Paciente = require("./models/pacientes");
var dateTime = require("node-datetime");
var app = express();
mongoose.Promise = global.Promise;
var mongoDB = mongoose.connect('mongodb://localhost/pacientes', {
useMongoClient: true
});
app.use(bodyParser.json()); //leyendo parámetros de una petición JSON
app.use(bodyParser.urlencoded({ extended: true })); //facilita la lectura de los parámetros de una petición
app.use(express.static("client")); //servido de archivos estáticos
//obteniendo los pacientes
app.get("/app/pacientes", function(req, res){
//find busca todos los datos de la DB
Paciente.find(function(err, pacientes){
if(err){
res.send("Ocurrió error obteniendo los pacientes");
}else{
res.send(pacientes);
}
//Paciente.findOneAndUpdate({_id: req.params.id, fecha: {$lt: Date()}}, {$set: {estado: 'Atendido'}});
});
});
//obteniendo UN paciente
app.get("/app/pacientes/:id", function(req, res){
//método findOne el cual recibe el id del paciente a buscar en la DB
Paciente.findOneAndUpdate({_id: req.params.id, fecha: {$lt: Date()}}, {$set: {estado: 'Atendido'}}, function(err, paciente){
if(err){
res.send("Ocurrió error obteniendo el paciente deseado");
}else{
res.json(paciente);
}
});
});
//agregando pacientes
app.post("/app/pacientes", function(req, res){
//creando paciente con los datos enviados por el user en el cuerpo de la petición
Paciente.create(req.body, function(err, pacientes){
if(err){
res.send("Error al agregar paciente");
}else{
res.json(pacientes)
}
});
});
//actualizando paciente
app.put("/app/pacientes/:id", function(req, res){
//creamos una variable(actualiza) la cual tomará los atributos a actualizar y se enviará como un query en el método update
var actualiza = {
nombre: req.body.nombre,
estado: req.body.estado,
fecha: req.body.fecha,
edad: req.body.edad,
sexo: req.body.sexo,
contacto: req.body.contacto
};
//encontramos un paciente y lo actualizamos, pasamos el query con los atributos actualizados
Paciente.findOneAndUpdate({_id: req.params.id}, actualiza, function(err, paciente){
if(err){
res.send("Ocurrió error actualizando" + err);
}else{
res.json(paciente);
}
});
/* === SOL === */
// req.body.fecha = new Date(req.body.fecha);
// console.log("=== "+req.body.fecha);
// Paciente.findOneAndUpdate({_id: req.params.id, fecha: {$lt: Date()}}, {$set: {estado: 'Atendido'}});
});
//borrar paciente
app.delete("/app/pacientes/:id", function(req, res){
//método para encontrar y eliminar un dato en la DB, el _id es el identificador en la DB
Paciente.findOneAndRemove({_id: req.params.id}, function(err, pacientes){
if(err){
res.send("Error al eliminar el paciente");
}else{
res.json(pacientes)
}
});
});
//app corriendo en puerto 8888
app.listen(8888, function() {
console.log("App corriendo en 8888");
});
我考虑为病史创建一个新的Schema,然后对Paciente的“父”架构做一个参考。我希望我能说清楚。
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var historia_schema = new Schema({
historia: {type: String, required: true},
paciente: {type: Schema.Types.ObjectId, ref: "Paciente", required: true}
});
module.exports = mongoose.model("Historia", historia_schema);
答案 0 :(得分:0)
如果我理解正确,您可以使用aggregation,尤其是$lookup进行左外连接。
Paciente.aggregate([
{
$lookup: {
from: 'historias',
localField: '_id',
foreignField: 'paciente',
as: 'historia'
}
}
]).exec(function (err, pacientes) {
// each document will have an "historia" array of their medical records
});
您可能会发现设置virtual population
也很有用paciente_schema.virtual('historia', {
ref: 'Historia',
localField: '_id',
foreignField: 'paciente'
});
这样你可以在某个地方做到
Paciente.find({}).populate('historia').exec(function (err, pacientes) {
// each "paciente" will have an "historia" array of their medical records
});