【问题标题】:How to update a nested object in using Mongoose如何在使用 Mongoose 时更新嵌套对象
【发布时间】:2018-12-20 15:12:25
【问题描述】:

假设给定User 上的当前数据是

{
            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 应该是完整的用户记录。

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

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

不得不对数据库进行 2 次调用,一个来查找另一个来更新,感觉有点矫枉过正

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,例如User.update(searchBy, {$set: user}, {upsert:true}),这将保留您所有剩余的字段
  • @ArifKhan 不起作用仍在从文档中删除更新语句中未设置的字段

标签: javascript node.js mongodb mongoose nosql


【解决方案1】:

我认为您应该在更新查询中使用$set。请参阅下面的查询,它已经过测试并可以根据要求正常修改

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

})

【讨论】:

    【解决方案2】:

    您应该在您的Model.update 中使用$set。如果需要,请按照this 链接作为示例,应该可以解决问题。

    【讨论】:

    • 我尝试将{'$set': user} 添加到我想要的查询中,但没有成功。你能提供它在哪里工作的例子吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多