【问题标题】:How to change an object field value in Node JS? [duplicate]如何更改 Node JS 中的对象字段值? [复制]
【发布时间】:2020-08-06 04:59:02
【问题描述】:

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

  • 公司的对象(包含有关它的所有详细信息以及该公司的所有者。首先,所有者将是一个 ID,使用 POST 请求给出)。
  • 所有者的对象(通过第一步中给出的 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

那么我该怎么做才能完成这项任务呢?

谢谢!

【问题讨论】:

  • 使用save() 函数。 newCompany.save() 或者如果您需要等待它返回 await newCompany.save()
  • 这能回答你的问题吗? Mongoose: Find, modify, save
  • save() 函数将对象保存到数据库,对吧?我想先更改对象的内容,然后再保存。在这一点上,我的 newCompany 对象在属性 newCompany.owner 处具有所有者的 ID。我希望它拥有所有者的对象。你明白?谢谢你帮助我。

标签: javascript node.js mongodb mongoose


【解决方案1】:

跟进您的评论:

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

您的 Company 架构很可能包含对 User 架构的 ObjectId 引用:

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

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

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

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

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

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

这将返回带有填充用户对象的公司对象。所以你只存储user._id,但是mongoDB和mongoose会确保给你相应的用户对象。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2015-12-27
    • 1970-01-01
    • 2014-06-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多