如何在Mongodb / Mongoose中使用子文档处理深度更新?

我想在这种情况下使用mongoose。 假设我们有这样的Schema:

const userSchema = new Schema({ name: { first: { type: String, required: true }, last: { type: String, required: true }, }, email: { type: String, required: true, unique: true, lowercase: true }, }); 

假设我们已经有了名字和姓氏的文件。 我需要更新只有名字和电子邮件与以下args对象:

 const updateUser = { name: { first: Eddy, }, email: 'eddy@gordo.io' }; 

如果将在大多数情况下与mongoose更新方法一起使用,它也会将姓氏更改为null 。 这是因为JavaScript不支持深度对象合并等等。 那么获得合适对象的可能性最好的方法是什么?

我已经find了在下面做的方法,但它似乎并不是最好的解决scheme:

 User.findById(args.id, (error, user) => { if (error) throw err; user.name.first = args.name.first ? args.name.first : user.name.first; user.name.last = args.name.last ? args.name.last : user.name.last; user.email = args.email ? args.email : user.email; user.save((err, updatedUser) => { if (err) throw err; return updatedUser; }); }); 

我和Eslint不喜欢重新分配和不可维护的代码。 有更好的主意? 我不确定我只需要使用lodash和其他库来实现这个function。

这是我在这个问题上所做的。

感谢Neil Lunn提出 这个想法 。

我们需要将所有对象键映射到dot.notation并传递给$ set。

这是这个function的要点 。 如果我们需要两层嵌套,我们可以添加另一个条件和映射。

无论如何,我希望Mongoose API能够解决我们与嵌套对象的深度合并,但是现在Neil的解决scheme在我看来是最好的。