Node.js 获取CastError,ObjectId值失败
我有一个将文档数组插入集合的路径。我还想将文档的_is捕获到用户模式中,但是我得到了一个CastError,我如何解决这个问题。这是我的密码: 错误: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
(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]”失败。不过我还是设法解决了这个问题,非常感谢你。很高兴知道。谢谢你的发帖。很高兴知道。谢谢你的发帖。