【问题标题】:How to auto update a field when current date is the same than a specific date当前日期与特定日期相同时如何自动更新字段
【发布时间】:2018-01-26 08:14:18
【问题描述】:

我正在做一个项目,我的网站展示活动信息和日期,例如示例 5sep。但是,当当前日期相同或已经超过设定日期时,我想自动更新其中设置等待参加的字段。 我正在使用 mongoDB、nodeJs、mongoose。

架构模型

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var dateTime = require("node-datetime");

var paciente_schema = new Schema({

nombre: {type: String, required: true},
estado: {type: String, required: true},
fecha: {type: Date, 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 }));
    app.use(express.static("client")); //servido de archivos estáticos



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


//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.findOne({_id: req.params.id}, function(err, paciente){
        if(err){
            res.send("Ocurrió error obteniendo el paciente deseado");
        }else{
            res.json(paciente);
        }

    });
});



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

console.log("FECHA USUARIO: " + req.body.fecha); //Mark
console.log(typeof(req.body.fecha));
var fecha2 = fecha2.toDate()
var fecha = new Date();
console.log("FECHA NEW DATE " + fecha);
console.log(typeof(fecha));
if(req.body.fecha === fecha){
    console.log("WWWW");
}


    });
});


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

    });
});


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

routes.js

//Modulo que engloba los controladores, rutas y demás configuracione
var myApp = angular.module("myApp", ["ngRoute"]);
//Agregamos el módulo ngRoute como una dependencia, hace que la app sea SPA
myApp.config(function($routeProvider){
    //con el módulo ngRoute agregado podemos usar el routeProvider, el cual se usa para configurar diferentes rutas
    //inicio
    $routeProvider
        .when("/", {
            templateUrl: "templates/lista.html",
            controller: "empController"
        })
        //lista de pacientes
        .when("/pacientes", {
            templateUrl: "templates/lista.html",
            controller: "empController"
        })
        //mostrar un paciente en específico
        .when("/pacientes/:id/mostrar", {
            templateUrl: "templates/mostrar.html",
            controller: "empController"

        })
        //crear un paciente
        .when("/pacientes/crear", {
            templateUrl: "templates/crear.html",
            controller: "empController"
        })
        //editar un paciente
        .when("/pacientes/:id/editar", {
            templateUrl: "templates/editar.html",
            controller: "empController"
        });
});

我不知道是否需要在这里发布更多代码,请告诉我,我是新手。对不起 我只是想知道如何通过无线电表格更改状态(estado),它需要 2 个值等待或参加,我想知道一旦当前日期(fecha)与日期匹配(fecha),它如何自动更新为参加由用户输入。

【问题讨论】:

  • 您可能想分享一些(事实上很多)关于您的具体案例的更多信息。示例数据、示例查询、精确问题或任何让我们更清楚您的问题的内容。
  • 使用另一个字段的值更新 MongoDB 字段这就是我基本上想要做的,当当前日期“更高”时,我希望状态更改表单中的放置日期
  • 我仍然不太确定我是否理解。你可能和这里的这个人有同样的问题吗? stackoverflow.com/questions/3974985/…
  • 有点,但不是真的。我的意思是::我有这个表单,其中有很多字段,其中一个是 status (它需要 2 个值:Waiting 和 Attended),另一个是 date,表单中的所有数据都使用 mongoose 发送到 mongoDB。我想做的是,对于数据库中的日期,我想找到一种方法,当当前 PC 日期 >= 比数据库中的日期时,状态字段的值会自动从等待更改为已参加。这就是我想做的,我不知道该怎么做。我希望你现在能理解我

标签: node.js mongodb date express mongoose


【解决方案1】:

这不能使用单个标准更新命令来完成(另请参阅herehere)。

但是,您可以通过两种方式解决此问题:

您首先加载现有实体,然后更新 JavaScript 中的所有内容并将其发送到 MongoDB:

Paciente.findOne({_id: req.params.id}).exec(function (err, p) {
    p.nombre = req.body.nombre;
    p.estado = req.body.estado;
    p.fecha = req.body.fecha;
    p.edad = req.body.edad;
    p.sexo = req.body.sexo;
    p.contacto = req.body.contacto;

    if (p.fecha < Date()) {
        p.estado = "attended";                       
    }

    Paciente.save(p);
});

作为替代方案,您几乎可以保留现有内容,然后发送带有附加过滤器的第二个更新查询,如下所示:

// update your document first
Paciente.findByIdAndUpdate(req.params.id, actualiza);

// update estado if fecha is in the past
Paciente.findOneAndUpdate({_id: req.params.id, fecha: {$lt: Date()}}, {$set: {estado: 'attended'}});

我个人建议您采用第二种方法。

【讨论】:

  • 感谢您的回答,先生,一定会尝试的!我的理解是我将Paciente.findOneAndUpdate({_id: req.params.id, fecha: {$lt: Date()}}, {$set: {estado: 'attended'}}); Insine 我的更新功能
  • 这有效,但不如预期。这应该就像一直在听服务器一样,所以当我打印出患者列表时,状态(estado)字段应该已经自动更新,而无需编辑患者
  • 使用 MongoDB 无法做到这一点。当然,您可以使用投影从数据库中检索 estado 的不同值,无论实际存储的是什么。在这种情况下,我建议您甚至不要存储 estado,因为它看起来更像是一个计算值,而不是需要存储的东西......?
  • 我就是这么想的。还是谢谢你帮助我!这不完全是解决方案,但它的工作方式与预期不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多