更新的日期字段未更新

时间:2016-12-01 12:18:44

标签: mongodb express mongoose

我已定义此架构

var docSchema = mongoose.Schema({
    name:{type:String,required:true},
}, { timestamps: { createdAt: 'createdAt',updatedAt:'updatedAt' }, collection : 'docs', discriminatorKey : '_type' });

我使用此路线更新文件

router.post('/:id', auth, function(req,res,next) {
    var id = req.params.id;
    docA.findByIdAndUpdate(id, req.body, {new: true}, function(err, doc) {
        if(err)
            res.json(err);
        else if(doc==null)
            res.status(404).send({
                message: "Document not found"
            });
        else
            res.json(doc);
    });
});

我发现当我保存对文档的一些编辑时,updatedAt没有更新。 除了这个问题,考虑一下,将这些数据保存为更新日期数组的形式可能会有所帮助,如:

updatedAt : [
"2016-10-25T12:52:44.967Z",
"2016-11-10T12:52:44.967Z",
"2016-12-01T12:52:44.967Z"
]

解决方案(?):根据@ chridam的建议,我目前的办法是保留一系列更新日期:

docSchema.pre(`findOneAndUpdate`, function(next) {
if(!this._update.updateHistory) {
    console.log("findOneAndUpdate hook: updateHistory not present")
    this._update.updateHistory=[];
}
this._update.updateHistory.push(new Date);

return next();
});
docSchema.pre('save', function (next) {
    if(!this.updateHistory) {
        console.log("Save hook: updateHistory not present")
        this.updateHistory=[];
    }
    this.updateHistory.push(new Date);
next();
});

1 个答案:

答案 0 :(得分:1)

这是一个已知问题,请参阅插件here上的原始主题,其中dunnkers commented

  

实际上不可能将中间件挂钩到更新,   for($i=0;$i<count($_REQUEST['q_cat_name']);$i++) { $x.="('', '".$_REQUEST['quote']."', '".$_REQUEST['date']."', '".$_REQUEST['referenceno']."', '".$_REQUEST['q_cust_name']."', '".$_REQUEST['q_cat_name'][$i]."', '".$_REQUEST['p_name'][$i]."', '".$_REQUEST['quot_per_unit'][$i]."', '".$_REQUEST['quot_req_qty'][$i]."', '".$_REQUEST['quot_price'][$i]."', '".$_REQUEST['discount']."', '".$_REQUEST['quot_des'][$i]."', '".$_REQUEST['incident_charge']."', '".$_REQUEST['tax']."', '".$_REQUEST['quote_total']."', 'draft'),"; } echo $x; findByIdAndUpdatefindOneAndUpdate和   目前在猫鼬中findOneAndRemove

     

这意味着在使用其中任何一个时,实际上没有插件运行   功能

     

查看Mongoose文档中的notes部分   中间件。问题Automattic/mongoose#964也描述了这一点。

作为建议的解决方法,考虑您的架构更改:

findByIdAndRemove

另一种方法是将钩子附加到模式:

var docSchema = mongoose.Schema({
    "name": { "type": String, "required": true },
    "updateHistory": [Date]
}, { 
    "timestamps": { 
        "createdAt": 'createdAt',
        "updatedAt": 'updatedAt' 
    }, 
    "collection" : 'docs', 
    "discriminatorKey": '_type' 
});

router.post('/:id', auth, function(req,res,next) {
    var id = req.params.id;
    docA.findByIdAndUpdate(id, req.body, {new: true}, function(err, doc) {
        if(err)
            res.json(err);
        else if(doc==null)
            res.status(404).send({
                message: "Document not found"
            });
        else {
            doc.updateHistory.push(new Date());
            doc.save().then(function(doc){
                res.json(doc);
            }, function(err) {
                // want to handle errors here
            })
        }            
    });
});