我正在寻找一种使用mongoose更新嵌入式文档的简便方法,而无需手动设置每个特定字段。查看this question的已接受答案,一旦找到要更新的嵌入式文档,就必须实际设置每个相应的属性,然后保存父级。我更喜欢传递一个更新对象,让MongoDB设置更新。
e.g。如果我正在更新常规(非嵌入)文档,我会这样做:
models.User.findOneAndUpdate({_id: req.params.userId}, req.body.user, function(err, user) {
err ? resp.status(500).send(err) : user ? resp.send(user) : resp.status(404).send();
});
在这里,我实际上不必遍历req.body.user中的每个属性并设置更改。我也找不到用子文档做这种事情的方法吗?
我的架构如下:
var UserSchema = BaseUserSchema.extend({
isActivated: { type: Boolean, required: true },
files: [FileSchema]
});
var FileSchema = new mongoose.Schema(
name: { type: String, required: true },
size: { type: Number, required: true },
type: { type: String, required: true },
});
我正在尝试根据用户和文件ID更新文件。
我是否需要创建一个辅助函数来设置值,或者是否有MongoDB这样做?
非常感谢。
答案 0 :(得分:4)
很好地假设你有一些东西有你" filedata"在变量中,当然还有您要更新的用户_id,那么您不需要$set
运算符:
var user = { /* The user information, at least the _id */
var filedata = { /* From somewhere with _id, name, size, type */ };
models.User.findOneAndUdate(
{ "_id": user._id, "files._id": filedata._id },
{
"$set": {
"name": filedata.name,
"size": filedata.size,
"type": filedata.type
}
},
function(err,user) {
// Whatever in here, but the update is already done.
}
);
或者实际上,只有$set
只是{{3}}您真正想要的字段"更新"只要你知道你的意思。所以如果你只需要改变"尺寸"然后就这样设置一下。