node.js - 是否有可能在MongoDB中删除 "join"文档并删除 "parent"文档但仍然保留 "child"文档?

标签 node.js mongodb express mongoose

我正在使用 MEAN 堆栈构建一个 CRUD 应用程序。 我有一个患者模式,我需要向这些患者添加病史,我想知道是否可以像mysql中那样使用“连接”来关联这些文档。如果是的话,即使在删除患者后我如何保留病史

这是我的病人架构

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

我考虑过为病史创建一个新的架构,然后引用“父”架构,即 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);

最佳答案

如果我理解正确的话,你可以使用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
});

关于node.js - 是否有可能在MongoDB中删除 "join"文档并删除 "parent"文档但仍然保留 "child"文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45865279/

相关文章:

javascript - 如何添加完整的公共(public)目录以捆绑 Webpack 中的所有文件?

javascript - Mongoose :如何更新数组中的现有元素?

javascript - 如何对使用 Node.js + Express.js 下载的文件进行功能/单元测试

node.js - “submodule”似乎是一个 git 命令,但我们无法执行它

node.js - 制作用于单元测试的 git 存储库

javascript - Jade 表迭代,其中包含不同的内容

javascript - 如何在 node + express 中重新运行请求处理程序?

mysql - 有没有一种快速的方法可以在任何数据库中进行 '%phrase%' 搜索?

node.js - 在 where 子句中使用 OR 时出错

express - GraphQL 响应错误 "URLSearchParams is not defined"