繁体   English   中英

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

[英]How to process deep update with subdocument in Mongodb/Mongoose?

我想在这种情况下使用猫鼬。 假设我们有一个这样的模式:

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'
};

如果在大多数情况下将其与猫鼬更新方法一起使用,则还将姓氏更改为null 这是因为JavaScript不支持深度对象合并等。 那么获得正确合并对象可能性的最佳方法是什么?

我在下面找到了实现此目标的方法,但它似乎并不是最佳解决方案:

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和其他库。

这是我针对此问题所做的工作。

感谢Neil Lunn这个想法

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

这是具有此功能的要点 如果需要两层嵌套,则可以添加另一个条件和映射。

无论如何,我希望Mongoose API能够解决我们与嵌套对象进行深度合并的问题,但就目前而言,我认为Neil的解决方案是最好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM