簡體   English   中英

如何在貓鼬中分配一個objectid數組

[英]How to assign an array of objectid 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"))

我收到了這個錯誤

端口 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) 在新模型 (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:未處理的承諾拒絕。 這個錯誤要么是因為在沒有 catch 塊的情況下拋出了異步函數,要么是因為拒絕了一個沒有用 .catch() 處理過的承諾。 (rejection id: 1) (node:42988) [DEP0018] DeprecationWarning:不推薦使用未處理的承諾拒絕。 將來,未處理的承諾拒絕將使用非零退出代碼終止 Node.js 進程。

我怎么能有解決方案??

你的錯誤正在等待中。 如果你調用 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"))

我解決了這個問題。

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 不會導致任何問題

感謝您的答復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM