是否有可能在MongoDB中“join”文档并删除“父”文档,但仍保留“子”文档?

我正在用MEAN堆栈构build一个CRUD应用程序。 我有一个patients模式,我需要给这些患者添加一个medical history ,我想知道是否可以像使用mysql中的“连接”来使用这些文档。 如果是的话,甚至在病人被删除之后,我怎么能保留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"); }); 

我想过为病历创build一个新的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); 

如果我理解正确,你可以使用聚合 ,特别是$ 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 }); 

您可能会发现build立一个虚拟人口也很有用

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