【问题标题】:Update embedded document mongoose更新嵌入文档 mongoose
【发布时间】:2014-06-12 15:19:46
【问题描述】:

我正在寻找一种使用猫鼬更新嵌入文档的简单方法,而无需手动设置每个特定字段。查看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 方法可以做到这一点?

非常感谢。

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongodb-query


    【解决方案1】:

    假设你有一些东西在一个变量中有你的“文件数据”,当然还有你正在更新的用户 _id,那么你就不需要 $set 运算符:

    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 您真正要“更新”的字段。因此,如果您只需要更改“大小”,那么只需设置它即可。

    【讨论】:

    • 嘿,尼尔。感谢您的回答。我想也许我的问题并不清楚。我知道我可以在更新中单独设置每个值。但我想做的只是传入一个对象,其中包含我想对嵌入文件文档进行的更新。例如,在发出 HTTP put 请求时,这将很有用,我不知道用户想要进行哪些更新。这在 mongoose/mongodb 中是否可能,而无需在保存之前编写辅助函数来设置属性?再次感谢。
    • @Sherlock 你是对的,你的问题不是很清楚,评论也不是。也许您应该通过明确说明您想要做什么来更新您的问题。但除非您在更新部分使用 $set$push 类型的语法,否则除了替换整个数组之外,您不能做任何事情。
    • 好的,这回答了我的问题。谢谢。
    猜你喜欢
    • 2023-03-10
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2020-06-07
    • 2018-09-04
    • 2016-10-06
    • 2012-11-20
    相关资源
    最近更新 更多