如何在Node JS中更改对象字段值?

时间:2020-08-05 17:41:16

标签: javascript node.js mongodb mongoose

我正在尝试使用Node JS和Mongoose建立一对多的关系。 我有以下内容:

  • 公司的对象(包括有关该公司的所有详细信息以及该公司的所有者。首先,所有者将是使用POST请求提供的ID。)
  • 所有者的对象(通过第一步提供的ID找到)

我要在数据库中介绍的内容:

我想为公司重用该对象,并使用所有者对象更改所有者ID,然后将其引入数据库中。问题是,当我想更改所有者的值时,它保持不变。

这是公司对象:

var newCompany = new Company({
            owner: req.body.owner,
            name: req.body.name,
            email: req.body.email,
            phone: req.body.phone,
            web: req.body.web
        })

我有这个:

const companyOwner = await User.findById(newCompany.owner)
newCompany.owner = companyOwner

那么我想做些什么吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

关注您的评论

要回答您的问题,您必须了解mongoose / MongoDB中外键和ObjectId的概念。

您的公司架构很可能包含对用户架构的ObjectId引用:

owner: { type: Schema.Types.ObjectId, ref: 'User' }

这意味着,您正在将user._id存储在公司对象内部以指向用户对象。猫鼬将确保仅存储_id而不是整个对象,以降低存储成本。猫鼬足够聪明,如果它检测到company.owner = companyOwner;之类的用户对象,它实际上会这样做:company.owner = companyOwner._id;。这就是您困惑的来源。

您希望拥有用户对象,可能将其传递给端点或由端点返回,这是可能的,但是您必须以不同的方式进行操作。

用于存储:只需保留您的代码,猫鼬将确保仅存储user._id

要检索populate()是您要寻找的。将公司保存到数据库后,可以通过调用以下方法来检索它,包括完整的填充用户对象:

const company = await Company.findById(company._id).populate('owner');

这将返回带有填充的用户对象的公司对象。因此,您只存储user._id,但是mongoDB和mongoose将确保为您提供相应的用户对象。