如何在猫鼬中分配一个objectid数组
Posted
技术标签:
【中文标题】如何在猫鼬中分配一个objectid数组【英文标题】:How to assign an array of objectid in mongoose 【发布时间】:2020-05-25 06:15:33 【问题描述】:我正在测试猫鼬中的固定种群。
const mongoose = require('mongoose')
const ObjectId = require('mongodb');
const app = require('express')()
mongoose.connect('<connection fine>', useNewUrlParser: true, useUnifiedTopology: true )
mongoose.connection.once('open', function ()
console.log('Connection with database')
);
const CompanySchema = new mongoose.Schema(
name: String,
address: String,
employees: type: mongoose.Schema.Types.ObjectId, ref: 'employee'
)
const DepartmentSchema = new mongoose.Schema(
name: String,
location: String
)
const EmployeeSchema = new mongoose.Schema(
firstName: String,
lastName: String,
mobile: String,
department: type: mongoose.Schema.Types.ObjectId, ref: 'department'
)
let Department = mongoose.model('department', DepartmentSchema)
let Employee = mongoose.model('employee', EmployeeSchema)
let Company = mongoose.model('company', CompanySchema)
app.use("/", async (req, res) =>
await Department.deleteMany()
await Employee.deleteMany()
await Company.deleteMany()
await Department.create(
name: 'IT Department',
location: 'Building A'
)
await Department.create(
name: 'Marketing Department',
location: 'Building B'
)
await Employee.create(
firstName: 'Manel',
lastName: 'Jakin',
mobile: '986374763',
department: await Department.findOne( name: 'IT Department' )
)
await Employee.create(
firstName: 'Laurel',
lastName: 'Borbas',
mobile: '967583566',
department: await Department.findOne( name: 'Marketing Department' )
)
await Company.create(
name: 'MagoDev',
address: 'Algarve',
employees: await Employee.find().select('_id') // or await Employee.find()
)
res.json(
//departments: await Department.find(),
//employees: await Employee.find().populate('department'),
company: await Company.find().populate(
path: 'employee',
model: 'employee',
populate: path: 'department', model: 'department'
)
)
)
app.listen(5000, () => console.log("Server on port 5000"))
我收到了这个错误
5000 端口上的服务器 与数据库的连接 (节点:42988)UnhandledPromiseRejectionWarning:ValidationError:公司验证失败:员工:Cast to ObjectID failed for value "[ _id: 5e408062eaef2ca7ec5c2d35 , _id: 5e408063eaef2ca7ec5c2d36 ]”在路径“员工” 在新的 ValidationError (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\error\validation.js:31:11) 在 model.Document.invalidate (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\document.js:2490:32) 在 model.$set (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\document.js:1200:12) 在 model._handleIndex (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\document.js:935:14) 在 model.$set (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\document.js:879:22) 在 model.Document (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\document.js:137:12) 在 model.Model (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\model.js:102:12) 在新模型(C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\model.js:4618:15) 在 toExecute.push.callback (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\model.js:3083:22) 在 toExecute.forEach (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\model.js:3119:7) 在 Array.forEach () 在 utils.promiseOrCallback.cb (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\model.js:3118:15) 在 Promise (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\utils.js:283:5) 在新的承诺 () 在 Object.promiseOrCallback (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\utils.js:282:10) 在 Function.create (C:\Users\media\Documents\Projects\Mongoose-population\node_modules\mongoose\lib\model.js:3053:16) (节点:42988)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或通过拒绝 未使用 .catch() 处理的承诺。 (拒绝编号:1) (节点:42988)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
我该如何解决?
【问题讨论】:
【参考方案1】:我解决了这个问题。
const CompanySchema = new mongoose.Schema(
name: String,
address: String,
employees: type: mongoose.Schema.Types.ObjectId, ref: 'employee'
)
这应该在员工值中包含 []。
const CompanySchema = new mongoose.Schema(
name: String,
address: String,
employees: [ type: mongoose.Schema.Types.ObjectId, ref: 'employee' ]
)
其次,我们应该使用路径填充公司的响应:员工模型员工
res.json(
//departments: await Department.find(),
//employees: await Employee.find().populate('department'),
company: await Company.find().populate(
path: 'employees',
model: 'employee',
populate:
path: 'department',
model: 'department',
)
)
有了这个改变,它就可以工作了...... async/await 不会导致任何问题
感谢您的回复
【讨论】:
【参考方案2】:你的错误在等待。如果你调用 await 应该在最后使用 .exec() 。 在您的代码中,您将承诺传递给模型而不是返回值; 您的代码应如下所示。
const mongoose = require('mongoose')
const ObjectId = require('mongodb');
const app = require('express')()
mongoose.connect('<connection fine>', useNewUrlParser: true, useUnifiedTopology: true )
mongoose.connection.once('open', function ()
console.log('Connection with database')
);
const CompanySchema = new mongoose.Schema(
name: String,
address: String,
employees: type: mongoose.Schema.Types.ObjectId, ref: 'employee'
)
const DepartmentSchema = new mongoose.Schema(
name: String,
location: String
)
const EmployeeSchema = new mongoose.Schema(
firstName: String,
lastName: String,
mobile: String,
department: type: mongoose.Schema.Types.ObjectId, ref: 'department'
)
let Department = mongoose.model('department', DepartmentSchema)
let Employee = mongoose.model('employee', EmployeeSchema)
let Company = mongoose.model('company', CompanySchema)
app.use("/", async (req, res) =>
await Department.deleteMany()
await Employee.deleteMany()
await Company.deleteMany()
await Department.create(
name: 'IT Department',
location: 'Building A'
)
await Department.create(
name: 'Marketing Department',
location: 'Building B'
)
await Employee.create(
firstName: 'Manel',
lastName: 'Jakin',
mobile: '986374763',
department: await Department.findOne( name: 'IT Department' ).exec()
)
await Employee.create(
firstName: 'Laurel',
lastName: 'Borbas',
mobile: '967583566',
department: await Department.findOne( name: 'Marketing Department' ).exec()
)
await Company.create(
name: 'MagoDev',
address: 'Algarve',
employees: await Employee.find().select('_id') // or await Employee.find().exec()
)
res.json(
//departments: await Department.find(),
//employees: await Employee.find().populate('department'),
company: await Company.find().populate(
path: 'employee',
model: 'employee',
populate: path: 'department', model: 'department'
).exec()
)
)
app.listen(5000, () => console.log("Server on port 5000"))
【讨论】:
以上是关于如何在猫鼬中分配一个objectid数组的主要内容,如果未能解决你的问题,请参考以下文章