在某些应用程序中,MongoDB 的自动生成 _id 可能不能满足需求,可能需要开发人员自己生成主键。Mongoose 提供了一种方法来使用自定义 ID,这里将介绍如何利用 Mongoose 自定义 ID,包括生成自定义主键和实现自定义主键的解析。
生成自定义主键
自定义生成主键需要向 MongoDB 发送一个 insert 命令,Mongoose 方便开发人员自定义 ID 的方法就是通过执行 pre hook,在保存模型实例之前修改 _id 属性。下面提供了一种用随机数生成自定义 ID 的示例代码:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const customIdSchema = new Schema({},{ _id: false }); customIdSchema.pre('save', function(next) { if (!this._id) { this._id = Math.floor(Math.random() * 100000000); // 随机数生成自定义 ID } next(); }); const CustomId = mongoose.model('CustomId', customIdSchema); const newCustomId = new CustomId(); console.log(newCustomId._id); // 生成类似于 "65432198" 的自定义 ID
实现自定义主键的解析
生成自定义主键后,Mongoose 默认不知道要使用哪个方法来解析它,需要手动告诉 Mongoose 解析方法。下面提供了一种用随机数生成自定义 ID 并实现解析的示例代码:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const customIdSchema = new Schema({ _id: Number }); // 注意定义类型为 Number // 解析 ID customIdSchema.statics.findById = function(id, callback) { return this.findOne({ _id: id }, callback); }; // 生成自定义 ID customIdSchema.pre('save', function(next) { if (!this._id) { this._id = Math.floor(Math.random() * 100000000); // 随机数生成自定义 ID } next(); }); const CustomId = mongoose.model('CustomId', customIdSchema); const newCustomId = new CustomId(); console.log(newCustomId._id); // 生成类似于 "65432198" 的自定义 ID CustomId.findById(newCustomId._id, (err, customId) => { if (err) { return console.error(err); } console.log(customId); // 输出 Mongoose 查询结果 });
在这个示例代码中,我们添加了一个 findById
静态方法来解析自定义 ID,用类似 find
的方式调用。执行 CustomId.findById(newCustomId._id, callback)
内部实际上是调用了 this.findOne({ _id: id }, callback)
, 这里的 id
参数就是传入的随机生成的自定义 ID。
总结
在应用程序中,MongoDB 的自动生成 _id 不一定满足需求,如有需要,可以通过 Mongoose 提供的 pre hook 方法来实现自定义 ID。示例代码演示了生成自定义主键和提供解析方法的步骤。此外,还可以根据应用的实际需求,在 pre hook 中实现更加丰富的主键生成方法,如引用其他字段、将时间戳转换为字符串等。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652bba127d4982a6ebd991f4