javascript - 如何使用 Mongoose 更新嵌套对象

标签 javascript node.js mongodb mongoose nosql

假设给定用户的当前数据是

{
            accountType:12,
            address:{
                address1:"uk1"
            },
            shareDealing:{
                providers:{
                    uk:{
                        accountProviderId:"12",
                        accountProviderName: "as",
                    }
                }
            }
        }

然后我想插入以下数据,更改所有字段,但我不包括 shareDealing.providers.uk.accountProviderName 因为它没有更改,我希望该数据保留在用户文档

所以我要更新的数据是

user = {
            accountType:22,
            address:{
                address1:"aaaaaa"
            },
            shareDealing:{
                providers:{
                    uk:{
                        accountProviderId:"333333333333",
                    }
                }
            }
        };

所以我运行了以下代码

User.update(searchBy, user, {upsert:true}).then((data) =>{

            if(data === null) throw new AppError(400,"User Not Found",5);

            res.json({ message: 'User Updated', data: req.body });
            logger.debug("Saved Data : Using  "+ JSON.stringify(searchBy) +" record: "+ JSON.stringify (data));
        }).catch( (error) => {
            new Errorhandler( new AppError(400,error)).display(req,res);
        });

我的问题

当我更新时,更新后的用户记录没有 accountProviderName: "as" 因为它认为最新的 JSON 应该是完整的用户记录。

有没有办法更新所有已更改的字段,但只需更新即可保留以前未触及的字段?

我知道解决方法是使用以下代码,但(也许是一厢情愿)我更愿意在更新功能链之外验证数据并将数据分配给我的用户记录。

必须对数据库进行两次调用,一次是为了查找,另一次是为了更新,这感觉有点过分了

User.findById(searchBy).then((fetchedUser) => {
            if(fetchedUser === null) throw new AppError(400,"User Not Found",5);

            // In my ideal world i would prefer to validate and assign data outside this chain
            return functionThatValidatesAndAssignsDataToTheUser(fetchedUser,user);
        }).then((model) => {
            return model.save();
        }).then((updatedModel) => {
            res.json({
                msg: 'model updated',
                updatedModel
            });
        }).catch((err) => {
            res.send(err);
        });

最佳答案

我认为你应该在更新查询中使用$set。请引用下面的查询,它已经过测试并且可以正常工作,根据要求进行修改

db.agreements.update({},{ $set:
  {
    "accountType":45,
    "address.address1":"india",
    "shareDealing.providers.uk.accountProviderId":984,
    }

})

关于javascript - 如何使用 Mongoose 更新嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51304772/

相关文章:

javascript - Nativescript 中的底部栏导航不起作用

javascript - 使用html5的不可见滚动条

node.js - 在 Bluemix 中构建 Node.js 应用程序时如何覆盖 node_modules 的默认缓存?

eclipse - Enide Studio (Nodeclipse) - 无法在 OS X Mavericks 上将项目调试为 NPM 包

node.js - 将用户凭据从前端传递到 Node 后端的最安全方法是什么

node.js - 如何在处理单用户帐户和多用户(具有角色的组织帐户)时创建 MongoDB 架构设计

javascript - 如果金额每天翻倍,最有效的 javascript 算法计算总数

javascript - 如何从 promise 中更新状态变量?

javascript - Nodejs 为什么 await 只限于异步函数?

c++ - 使用 MongoDB C++ 驱动程序处理通用 BSON 文档数组