2016-12-01 3 views
1

Я определил эту схемуОбновлено поле даты не обновляется

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

Это известная проблема, пожалуйста, обратитесь к оригинальной нити на плагины here, где dunnkerscommented:

Это фактически невозможно зацепить промежуточное программное обеспечение на обновление, findByIdAndUpdate, findOneAndUpdate, findOneAndRemove и findByIdAndRemove в Мангуста на данный момент.

Это означает, что плагин фактически не запускается при использовании любой из этих функций .

Ознакомьтесь с разделом notes в документации Mongoose для промежуточного программного обеспечения. Выпуск Automattic/mongoose#964 также описывает это.

Как предложил обходной путь, факторинг в ваших изменений схемы:

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

Другой подход был бы прикрепить крючок к схеме:

docSchema.pre("findOneAndUpdate", function() { 
    this.updatedAt = Date.now(); 
}); 
+0

Как вы можете видеть, я используйте дискриминаторKey, так что у меня есть несколько унаследованных моделей для 'doc':' docA', 'docB',' docC', 'docD' .. Возможно, предварительный кусок сохранения обеспечит такое же обходное решение? Тем не менее, он должен обрабатывать создание и редактирование. Я бы избегал тянуть тонны маршрутов. – alfredopacino

+0

Да, крюк предварительного обновления звучит как идеальный маршрут для вас. Проверьте обновленный ответ. – chridam

+0

, пожалуйста, проверьте мой отредактированный вопрос – alfredopacino

Смежные вопросы