首页 > 解决方案 > 得到一个 CastError,ObjectId 的值失败

问题描述

我有一条将文档数组插入集合的路线。我还想将文档的 _is 捕获到用户模式中,但我得到了 CastError,我该如何解决这个问题。这是我的代码:

错误:

(node:23088) UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "
  {
    _id: 6032c1df6761405a308736f0,
    name: ' test1',
    surname: 'test',
    email: 'example@example.com',
    phone: '0915461',
    __v: 0
  },
  {
    _id: 6032c1df6761405a308736f1,
    name: 'jane',
    surname: 'doe',
    email: 'jane@gmail.com',
    phone: '12345678',
    __v: 0
  }
]" at path "references"

路线:

app.post('/register_two/:id/references', async (req, res) => {
    const staff = await Worker.findById(req.params.id);
    
    const reference = await Reference.insertMany(req.body.references);
    
    await staff.references.push(reference); <<--- Error when i try to push document IDs

    
});

我的参考架构:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ReferenceSchema = Schema({
    name: String,
    surname: String,
    email: String,
    phone: String
});

module.exports = mongoose.model('Reference', ReferenceSchema);

我的工人模式

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const WorkerSchema = new Schema({
    name: String,
    surname: String,
    role: String,
    nationality: String,
    gender: String,
    dateofbirth: Date,
    contactnumber: String,
    email: String,
    address: String,
    region: String,
    righttowork: String,
    righttoworkproof: String,
    ninumber: String,
    references: [
        {
            type: Schema.Types.ObjectId,
            ref: 'Reference'
        }
    ],
    date: Date
});

module.exports = mongoose.model('Worker', WorkerSchema);

编辑:固定工作者模式

标签: node.jsmongodbmongoose

解决方案


您应该在选项设置为 true的情况下运行该insertMany命令rawResult

const reference = await Reference.insertMany(req.body.references, {rawResult: true});

这样您就可以将 MongoDB 驱动程序的原始结果返回到reference. 该结果将是一个包含此道具的对象:

...
...
insertedIds: { '0': 6032ce0ed7fd8568aef0d0cd, '1': 6032ce0ed7fd8568aef0d0ce, ... }
...

insertedIds是你需要的,但你需要它们以数组的形式。因此,您的代码应如下所示:

const reference = await Reference.insertMany(req.body.references, {rawResult: true});
await staff.references.push(...Object.values(reference.insertedIds));

感谢 Emil C.,他指出,通过推送一个数组,我们只是在reference路径内创建数组数组。传播就是答案。


推荐阅读