Node.js 获取CastError,ObjectId值失败

Node.js 获取CastError,ObjectId值失败,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个将文档数组插入集合的路径。我还想将文档的_is捕获到用户模式中,但是我得到了一个CastError,我如何解决这个问题。这是我的密码: 错误: (node:23088) UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value " { _id: 6032c1df6761405a308736f0, name: ' test1', surname: 'te

我有一个将文档数组插入集合的路径。我还想将文档的_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 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);


编辑:固定工作模式

您应该运行
insertMany
命令,并将
rawResult
选项设置为true

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);

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.,他指出,通过推动一个数组,我们只需在
引用
路径中创建数组数组。扩展就是答案。

您应该运行
insertMany
命令,并将
rawResult
选项设置为true

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.,他指出,通过推动一个数组,我们只需在
引用
路径中创建数组数组。扩展就是答案。

我使用扩展操作符解决了它,我所做的只是更改:

await staff.references.push(reference);


我用spread操作符解决了这个问题,我所做的只是改变:

await staff.references.push(reference);


你的工作模式与你的参考模式相同?@codemonkey谢谢你,犯了一个错误,我现在纠正了它你的工作模式与你的参考模式相同?@codemonkey谢谢你,犯了一个错误,我现在纠正了它嗨,当我尝试这个,它返回reference.insertedIds或reference.id的undefined,但在我的集合中,这两个引用将与其id一起添加。当我记录引用时,我得到的对象数组与我在错误消息中发布的对象数组相同。@EmilC。是我的错。我完全忽略了你使用猫鼬的事实。给我一秒钟,我会更正答案。@EmilC。更新。在我这边测试过这个。工作正常。我仍然收到一个错误:(节点:25544)未处理PromisejectionWarning:CastError:Cast to ObjectId在路径“references”处的值“[6032d20ab4072663c8212114,6032d20ab4072663c8212115]”失败。我用spread运算符解决了这个问题,非常感谢。我尝试这个方法时,它返回undefined for reference.insertedIds或reference.id,但在我的集合中,这两个引用将与它们的id一起添加。当我记录引用时,我得到的对象数组与我在错误消息中发布的对象数组相同。@EmilC。是我的错。我完全忽略了你使用猫鼬的事实。给我一秒钟,我会更正答案。@EmilC。更新。在我这边测试过这个。工作正常。我仍然收到一个错误:(节点:25544)未处理PromisejectionWarning:CastError:Cast to ObjectId在路径“references”处的值“[6032d20ab4072663c8212114,6032d20ab4072663c8212115]”失败。不过我还是设法解决了这个问题,非常感谢你。很高兴知道。谢谢你的发帖。很高兴知道。谢谢你的发帖。