У меня есть пост-маршрут, который получает данные из запроса PUT в экспресс-приложении, целью которого является обновление документа mongoose на основе введенной формы ввода. "Базовая" модель - это Profile
, и у меня есть две модели дискриминатора Helper
и Finder
которые условно добавляют поля в схему Profile
.
Таким образом, req.body.profile
будет содержать различные поля в зависимости от дискриминатора он ассоциирован с, но всегда будет содержать поля (username
, email
city
, accountType
), присутствующие в "базовой" модели, Profile
.
Перед отправкой запроса PUT пример документа в Profile
выглядит следующим образом:
{ jobTitle: '',
lastPosition: '',
email: '',
city: '',
accountType: 'helper',
_id: 5c77883d8db04c921db5f635,
username: 'here2help',
__v: 0 }
Это выглядит хорошо для меня и предполагает, что модель создается так, как я хочу (с базовыми полями из Profile
и теми, которые связаны с моделью Helper
- модели см. Ниже).
Мой маршрут POST выглядит следующим образом:
router.put("/profile/:id", middleware.checkProfileOwnership, function(req, res){
console.log(req.body.profile);
Profile.findOneAndUpdate(req.params.id, req.body.profile, function(err, updatedProfile){
if(err){
console.log(err.message);
res.redirect("/profile");
} else {
console.log(updatedProfile);
res.redirect("/profile/" + req.params.id);
}
});
});
Информация, которую я получаю из формы (console.log(req.body.profile)
), - это то, что я ожидаю увидеть:
{ accountType: 'helper',
username: 'here2help',
email: '[email protected]',
city: 'New York',
jobTitle: 'CEO',
lastPosition: 'sales rep'}
Однако после обновления документа с помощью req.body.profile
в Profile.findOneAndUpdate()
я не вижу обновленного возвращенного документа:
console.log(updatedProfile)
{ jobTitle: '',
lastPosition: '',
email: '[email protected]',
city: 'New York',
accountType: 'helper',
_id: 5c77883d8db04c921db5f635,
username: 'here2help',
__v: 0 }
Итак, поля, которые определены в моей "Базовой" модели (т. ProfileSchema
Те, которые определены в ProfileSchema
- см. Ниже), обновляются (например, city
), но те, которые есть в моих дискриминаторах - нет - см. Ниже.
Обновленная информация явно присутствует в req
, но не распространяется на модель Profile
Как это может быть?
Я также пытался использовать findByIdAndUpdate
но я получаю тот же результат.
Вот схемы, которые я определяю:
Профиль - моя "базовая" схема:
var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");
var profileSchema = new mongoose.Schema({
username: String,
complete: { type: Boolean, default: false },
email: { type: String, default: "" },
city: { type: String, default: "" }
}, { discriminatorKey: 'accountType' });
profileSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("Profile", profileSchema);
искатель
var Profile = require('./profile');
var Finder = Profile.discriminator('finder', new mongoose.Schema({
position: { type: String, default: "" },
skills: Array
}));
module.exports = mongoose.model("Finder");
помощник
var Profile = require('./profile');
var Helper = Profile.discriminator('helper', new mongoose.Schema({
jobTitle: { type: String, default: "" },
lastPosition: { type: String, default: "" }
}));
module.exports = mongoose.model("Helper");
Это моя первая попытка использования дискриминаторов в мангусте, поэтому более чем возможно, что я их неправильно настраиваю, и в этом корень проблемы.
Пожалуйста, дайте мне знать, если это неясно, или мне нужно добавить больше информации.