我的mogoose架构上有一些嵌套属性,如下所示:
const userSchemaValues = {
username: {
type: String,
required: [true, 'Username required'],
trim: true,
unique: true,
lowercase: true
},
password: {
type: String,
required: [true, 'Password required'],
trim: true,
minlength: 8
},
...
prop: {
prop_1: String,
prop_2: String
}
};
valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
log.debug(JSON.stringify(valuesToUpdate));
User.update({_id: req.params.id}, {$set: valuesToUpdate})
.then((data) => {
return res.json({message: data});
})
.catch(err => {
log.error(err);
return next({message: 'Error updating User.'});
});
但是当我对prop_1和_2设置了一个像这样的对象(User.update({_id: req.params.id}, {$set: valuesToUpdate})
)的用户{"prop":{"prop_1": "somevalue"}
时,它不会寻找支柱中的内容,它只是覆盖它。我怎么能绕过这个?
答案 0 :(得分:2)
您的查找需要包含要更新的属性。此更新语句还需要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.'});
});
请注意,位置更新仅更新FIRST事件!
更新:重新阅读你的问题后,我看到道具不是阵列...我很抱歉。 幸运的是,这使得它变得更容易:)
您不需要该字段出现在查找中 对于集合:{$ set:{" prop.prop1" :" newvalue" } 此外,位置更新不是必需的,因为它不是数组。
这使得以下内容:
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.'});
});
更新2:有关更新声明的更多信息。
由于评论,我将澄清更新命令。 如果要更新文档中的字段,请使用$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);
}
});
}
});
希望现在明白。