[英]How to assign an array of objectid in mongoose
Im testing the fixure population in mongoose.我正在测试猫鼬中的固定种群。
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"))
and i received this error我收到了这个错误
Server on port 5000 Connection with database (node:42988) UnhandledPromiseRejectionWarning: ValidationError: company validation failed: employees: Cast to ObjectID failed for value "[ { _id: 5e408062eaef2ca7ec5c2d35 }, { _id: 5e408063eaef2ca7ec5c2d36 } ]" at path "employees" at new ValidationError (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\error\\validation.js:31:11) at model.Document.invalidate (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document.js:2490:32) at model.$set (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document.js:1200:12) at model._handleIndex (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document.js:935:14) at model.$set (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document.js:879:22) at model.Document (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document.
端口 5000 上的服务器与数据库的连接(节点:42988)未处理的PromiseRejectionWarning:ValidationError:公司验证失败:员工:Cast to ObjectID 的值失败了“[ { _id: 5e408062eaef2ca7ec5c2d35 }, { _id: 5e408063eaef]"mployees at new ValidationError (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\error\\validation.js:31:11) at 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) at model._handleIndex (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document.js:935:14) at model.$set (C:\\Users\\media \\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document.js:879:22) at model.Document (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\document . js:137:12) at model.Model (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\model.js:102:12) at new model (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\model.js:4618:15) at toExecute.push.callback (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\model.js:3083:22) at toExecute.forEach (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\model.js:3119:7) at Array.forEach () at utils.promiseOrCallback.cb (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\model.js:3118:15) at Promise (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\utils.js:283:5) at new Promise () at Object.promiseOrCallback (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\utils.js:282:10) at Function.create (C:\\Users\\media\\Documents\\Projects\\Mongoose-population\\node_modules\\mongoose\\lib\\model.js:3053:16)
js:137:12) at 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) at Promise (C:\\Users\\media\\Documents\\Projects\\Mongoose -population\\node_modules\\mongoose\\lib\\utils.js:283:5) at new Promise () at 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) (node:42988) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
(node:42988) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。 This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
这个错误要么是因为在没有 catch 块的情况下抛出了异步函数,要么是因为拒绝了一个没有用 .catch() 处理过的承诺。 (rejection id: 1) (node:42988) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated.
(rejection id: 1) (node:42988) [DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。 In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
将来,未处理的承诺拒绝将使用非零退出代码终止 Node.js 进程。
How i can have a solution??我怎么能有解决方案??
Your wrong is in awaits.你的错误正在等待中。 if you call await shoud use .exec() at end.
如果你调用 await 应该在最后使用 .exec() 。 in your code you pass promises to model instead of returned value;
在您的代码中,您将承诺传递给模型而不是返回值; your code should be like below.
您的代码应该如下所示。
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"))
I solved the problem.我解决了这个问题。
const CompanySchema = new mongoose.Schema({
name: String,
address: String,
employees: { type: mongoose.Schema.Types.ObjectId, ref: 'employee' }
})
this should have [] in employees value.这应该在员工价值中有 []。
const CompanySchema = new mongoose.Schema({
name: String,
address: String,
employees: [{ type: mongoose.Schema.Types.ObjectId, ref: 'employee' }]
})
secondly, the response for populate the Company we should use path: employees on model 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',
}
})
})
with this changes it works... the async/await don't cause any issue有了这个更改,它就可以工作了…… async/await 不会导致任何问题
Thank you for the reply感谢您的答复
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.