由于 Mongoose findOne 中的值错误,转换为 ObjectId 失败
Posted
技术标签:
【中文标题】由于 Mongoose findOne 中的值错误,转换为 ObjectId 失败【英文标题】:Cast to ObjectId failed for value error in Mongoose findOne 【发布时间】:2018-03-04 16:50:32 【问题描述】:我一直在与一个奇怪的异常作斗争,一个小时后仍然对此感到困惑。
CastError:值“pedrammarandi@gmail.com”的对象 ID 转换失败 模型“帐户”的路径“_id”
我正在尝试通过电子邮件地址检索帐户。这是我的查询
export async function getPendingRecipients(user_id, email_address)
const account = await Account
.find(email: email_address)
.exec();
return true;
这是我的架构对象
const userGmailSchema = new Schema(
id:
type: String,
unique: true
,
displayName: String,
image: Object,
accessToken: String,
user:
type: Schema.Types.ObjectId,
ref: 'User'
,
refreshToken:
type: String,
default: null
,
email:
type: String,
unique: true
,
emails: [
type: Schema.Types.ObjectId,
ref: 'Emails'
]
);
【问题讨论】:
【参考方案1】:我不确定,但我想问题是你写了一个id
字段。
在MongoDB中,“主键”是_id
字段,它是一个ObjectId
对象(实际上是一个12字节的值),而在mongoose中,id
是_id
的一个虚拟getter ,简单地说,id
是_id
的别名。
(有点不同的是,_id
返回ObjectId
,id
返回String
版本的_id
。)
默认情况下,mongoose 会自动管理 _id
字段,所以我们通常不应该在 schema 中写任何关于 id
的内容。
如果您的 id
用于 SQL DB 中的主键 ID
之类的东西,只需将其从猫鼬模式中删除即可。如果它在您的应用中有其他含义,请尝试添加一个选项:
const userGmailSchema = new Schema(
// your schemas here
,
id: false // disable the virtual getter
)
或重命名。
http://mongoosejs.com/docs/guide.html#id
希望这会有所帮助。
【讨论】:
谢谢,这是一个非常重要的信息,没有这个我特别卡住,因为我们所有的 id 都是自定义生成的数字而不是对象 id。因此,如果 id 是其他任何东西,那么 ObjectId 设置这个属性就变得非常重要。以上是关于由于 Mongoose findOne 中的值错误,转换为 ObjectId 失败的主要内容,如果未能解决你的问题,请参考以下文章
带有 $or 条件的 Mongoose findOne 方法会引发错误
调用 findOne 并填充时,转换为 objectid 的值失败
Mongoose User.findOne 既不返回错误也不返回成功
更新 findOne()/find()/findById() 返回的文档 - mongoose