如何获取MongoDB插入文档后自动生成的_id值
问题修复方案
问题根因
- Mongoose 模型的创建方法拼写错误,正确调用应为小写的
create,你代码中使用的大写Create属于不规范写法,部分版本会导致异常 create方法的回调函数支持两个入参,第一个为错误对象,第二个才是插入数据库后返回的完整新文档对象。你当前没有接收第二个参数,直接访问传入的原始参数b的_id字段,而你传入的参数本身不包含_id,因此取值为undefined;用mongoose.Types.ObjectId()包裹undefined时,方法会随机生成一个新的ObjectId,自然和数据库实际生成的_id不匹配- 不需要额外手动转换
_id格式,Mongoose返回的文档中自带的_id本身就是合法的ObjectId类型
修复后代码
回调写法适配
exports.createBill = (b) => { return new Promise((resolve, reject) => { // 修正方法名,新增回调参数接收新文档 Bills.create(b, function (err, newBill) { if (err) { return reject(err); } // 直接取返回文档的_id console.log(newBill._id); // 将_id resolve给调用方使用 resolve(newBill._id); }); }); };
更简洁的async/await写法(推荐)
Mongoose的create本身就返回Promise,不需要手动封装Promise层:
exports.createBill = async (b) => { const newBill = await Bills.create(b); console.log(newBill._id); return newBill._id; };
调用方可以直接通过await createBill(参数)的方式拿到新生成的_id。
内容的提问来源于stack exchange,提问作者zupus
相关产品推荐
相关产品推荐

