【问题标题】:How to assign an array of objectid in mongoose如何在猫鼬中分配一个objectid数组
【发布时间】: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 进程。

我该如何解决?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案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"))
      

      【讨论】:

        猜你喜欢
        • 2020-08-15
        • 2017-04-25
        • 2021-06-25
        • 1970-01-01
        • 2015-01-27
        • 2019-09-16
        • 1970-01-01
        • 2020-07-25
        • 2013-07-27
        相关资源
        最近更新 更多