Ваша находка должна содержать свойство для обновления. Кроме того, оператор обновления нуждается в Positional Update Operator изменить его на (сбился моей голове):
valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
log.debug(JSON.stringify(valuesToUpdate));
User.update({$and : [{_id: req.params.id}, {prop.prop1 : "%oldvalue%"}]}, {$set: { "prop.$.prop1" : "%newvalue""}})
.then((data) => {
return res.json({message: data});
})
.catch(err => {
log.error(err);
return next({message: 'Error updating User.'});
});
Обратите внимание, что позиционное обновление обновляет только первое вхождение!
ОБНОВЛЕНИЕ: Перечитав свой вопрос, я увидел, что реквизит не является массивом ... Мне очень жаль. К счастью, это делает его намного проще :)
Вам не требуется поле, чтобы присутствовать в находке для набора: {$ набора: { «prop.prop1»: «новое_значение»} Кроме того, позиционного обновления не требуется, потому что это не массив.
Это делает следующее:
valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
log.debug(JSON.stringify(valuesToUpdate));
User.update({_id: req.params.id}, {$set: { "prop.prop1" : "%newvalue%"}})
.then((data) => {
return res.json({message: data});
})
.catch(err => {
log.error(err);
return next({message: 'Error updating User.'});
});
UPDATE2: Более подробная информация о заявлениях обновления.
Из-за комментариев я уточню команды обновления. Если вы хотите обновить поле в своем документе, вы используете команду $set. Это обновление одного или нескольких полей. Если вы хотите обновить несколько поля вы можете сделать это с помощью команды, как:
$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : "newvalueforprop2"} }
НО когда вы используете команду выше и указать одно одно поле он генерирует команду типа:
$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : null} }
Это все о том, как вы создаете команду обновления. Если вы не знаете, есть ли 1 или 2 свойства, вам необходимо обновить код, чтобы он генерировал команду динамически. Но еще одна вещь, которую вы могли бы сделать, это позволить mongoose обрабатывать обновление.
использовать что-то вроде:
User.findById(req.params.id, function (err, user) {
if (err) {
handleError(err)
}
else {
//you should to some checking if the supplied value is present (!= undefined) and if it differs from the currently stored one
user.prop.prop1 = "your value";
user.prop.prop1 = "2nd value"
user.save(function (err) {
if (err) {
handleError(err)
}
else {
res.json(user);
}
});
}
});
Надежда теперь это ясно.
Вы можете написать здесь полный запрос? – abdulbarik
Я обновил свой вопрос. –