javascript - 更新嵌入式文档 Mongoose

标签 javascript node.js mongodb mongoose mongodb-query

我正在寻找一种使用 mongoose 更新嵌入式文档的简单方法,而无需手动设置每个特定字段。查看对 this question 的接受答案,一旦找到要更新的嵌入式文档,您必须实际设置每个相应的属性,然后保存父级。我更愿意做的是传入一个更新对象并让 MongoDB 设置更新。

例如如果我要更新常规(非嵌入式)文档,我会这样做:

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 方法可以做到这一点?

非常感谢。

最佳答案

好吧,假设您有一些在变量中包含“文件数据”的东西,当然还有您正在更新的用户 _id,那么您不需要 $set运算符(operator):

var user = { /* The user information, at least the _id */
var filedata = { /* From somewhere with _id, name, size, type */ };

models.User.findOneAndUpdate(
    { "_id": user._id, "files._id": filedata._id },
    {
        "$set": {
            "name": filedata.name,
            "size": filedata.size,
            "type": filedata.type
        }
    },
    function(err,user) {
      // Whatever in here such a message, but the update is already done.
    }
);

或者真的,只是$set只要您知道您的意思是什么,您实际上意味着“更新”的字段。因此,如果您只需要更改“大小”,那么只需设置它即可。

关于javascript - 更新嵌入式文档 Mongoose ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23318035/

相关文章:

node.js - 使用域来测试 Node 调用堆栈深处抛出的错误。

node.js - bcrypt - Windows 10 x64 构建错误

angularjs - MEAN 和地理空间查询 - 查找与给定名称的另一个相交的 LineStrings

javascript - 在 Mongoose 子文档数组中使用子类

node.js - 如何将 nodejs 应用程序(在本地主机上开发)迁移到已安装 nodejs 的 linux 服务器?

json - 从 UI 写入数据库之前进行检查

javascript - 将参数传递给回调函数而不更改方法(Siesta 测试命名空间)

javascript - 将 javascript 与媒体查询集成的最可靠方法是什么?

Javascript 导航仅适用于调试

javascript - 为什么我的 dojo modulePaths 配置被忽略了?