如何修改Mongoose默认_id属性,自定义使用Oracle Cloud账户ID
用自定义Oracle Cloud OCID作为Mongoose文档主键的实现方案
你的需求是用Oracle Cloud提供的OCID(格式为ocid1.test.oc1..<unique_ID>EXAMPLE-compartmentId-Value)作为Account文档的主键,替代MongoDB默认生成的_id。之前将accountId设为ObjectId类型报错,是因为OCID不符合MongoDB ObjectId的格式要求(必须是12字节字符串、24位十六进制字符串或整数)。
正确的Schema配置方案
直接将accountId设为String类型,并指定它作为文档的主键,同时禁用默认的_id生成:
const { Schema } = require('mongoose'); const Account = new Schema({ name: { type: String, required: true }, accountId: { type: String, required: true, _id: true, // 将该字段设置为文档的主键 unique: true // 确保OCID唯一性,避免重复存储 }, piracicaba: [{ type: Schema.Types.ObjectId, ref: 'Piracicaba' }] }, { _id: false }); // 明确禁用默认的_id字段生成(可选,设置自定义主键后会自动禁用)
关键说明
- 主键指定:通过在
accountId字段中添加_id: true,Mongoose会将该字段作为文档的主键,替代默认的_id。 - 类型匹配:OCID是自定义字符串,必须用
String类型存储,不能用ObjectId类型,否则会触发格式校验错误。 - 唯一性保证:添加
unique: true约束可以确保数据库中不会存入重复的OCID,避免数据冲突。
后续操作时,你可以直接用OCID作为主键进行查询、更新等操作,例如:
// 根据OCID查询账户 const account = await Account.findById('ocid1.test.oc1..xxxxxxEXAMPLE-compartmentId-Value');
内容的提问来源于stack exchange,提问作者Samuel A. Souza
相关产品推荐
相关产品推荐

