对于Mongoose findOne中的值错误,转换为ObjectId失败

时间:2017-09-23 04:27:47

标签: javascript mongodb express mongoose ecmascript-6

我一直在为一个奇怪的例外而苦苦挣扎,并且在一小时后仍然对它感到困惑。

  

CastError:施放到ObjectId的值失败" pedrammarandi@gmail.com"   在路径" _id" for model" Account"

我试图通过电子邮件地址检索帐户。这是我的查询

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 个答案:

答案 0 :(得分:0)

我不确定,但我想问题是你写了一个id字段。

在MongoDB中,"主键"是_id字段,它是ObjectId对象(实际上它是12字节值),而在猫鼬中,id_id的虚拟getter很容易说,id_id的别名。

(稍有不同的是,_id返回ObjectIdid返回String _id版本。)

默认情况下,mongoose会自动管理_id字段,因此我们通常不应在架构中编写任何有关id的内容。

如果您的id用于SQL DB中的主键ID,只需将其从mongoose架构中删除即可。如果它在您的应用中意味着其他内容,请尝试添加选项:

const userGmailSchema = new Schema({
    // your schemas here
}, 
{
    { id: false }  // disable the virtual getter
})

或重命名。

http://mongoosejs.com/docs/guide.html#id

希望这有帮助。