我试图通过保存两个集合之间的引用来将它们连接到一起,但是我一直在研究如何插入数组。我有以下模式:
公司模式
const mongoose = require('mongoose')
const companySchema = mongoose.Schema({
name: {
type: String,
required: true
},
projects: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Project'
}]
})
module.exports = mongoose.model('company', companySchema, 'companies')项目模式
const mongoose = require('mongoose')
const projectSchema = mongoose.Schema({
name: {
type: String,
required: true
},
company: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Company'
}
})
module.exports = mongoose.model('project', projectSchema, 'projects')我的创建项目路由器看起来像这个
router.post('/create', async function(req, res) {
try {
let project = new Project({ name: req.body.name, company: req.body.company })
await project.save()
res.status(201).send({ project })
} catch (error) {
res.status(500).json({
error: 'Server error while creating project'
})
}
})它正确地创建了Project。但是现在我需要它也将新创建的Project推到Company模式的projects数组中。会很感激你的帮助。
发布于 2021-02-18 23:23:55
听起来更像是要引用与公司相关的项目,而不是实际添加对这些项目的引用。要做到这一点,您需要将公司的id存储到您的新项目中,我希望这就是您的req.body.company字段所代表的。
一旦每个新项目包含有效的companyId,您可能需要检查与同一公司关联的项目列表。为此,您需要在公司文档中填充一个虚拟字段:
companySchema.virtual('projects', {
ref: 'Projects',
localField: 'id',
foreignField: 'companyId'
})当然,只有在稍微修改模式的情况下,这才能起作用:
const companySchema = mongoose.Schema({
name: {
type: String,
required: true
}
})
const projectSchema = mongoose.Schema({
name: {
type: String,
required: true
},
companyId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Company'
}
})最后,无论何时要检查公司的项目,都必须使用companyDocument.populate('projects').execPopulate()填充projects字段。这样,companyDocument.projects将包含您要寻找的数组。
https://stackoverflow.com/questions/66268518
复制相似问题