我已定义此架构
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();
});
答案 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;
,findByIdAndUpdate
,findOneAndUpdate
和 目前在猫鼬中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
})
}
});
});