我正在尝试使用Node JS和Mongoose建立一对多的关系。 我有以下内容:
我要在数据库中介绍的内容:
我想为公司重用该对象,并使用所有者对象更改所有者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
那么我想做些什么吗?
谢谢!
答案 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将确保为您提供相应的用户对象。