📜  mongoose 生成新的 ObjectId (1)

📅  最后修改于: 2023-12-03 15:03:02.473000             🧑  作者: Mango

Mongoose 生成新的 ObjectId

在 MongoDB 中,每个文档都有一个独一无二的 _id 字段,它默认是一个 ObjectId 对象。Mongoose 提供了一个 ObjectId 类,可以用来生成新的 _id。

基础用法

可以使用以下方式在代码中生成一个新的 ObjectId:

const mongoose = require('mongoose');

const newId = new mongoose.Types.ObjectId();
console.log(newId); // 输出一个新的 ObjectId
用 ObjectId 作为默认 _id

可以在 Mongoose 模型中使用 ObjectId 作为默认的 _id 字段。只需要在定义 schema 的时候,将 _id 字段定义为 mongoose.Schema.Types.ObjectId。例如:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
  name: String,
}, {
  _id: true, // 将 _id 设置为 true,表示使用默认的 _id 字段
  timestamps: true, // 使用 timestamps,会默认生成 createdAt 和 updatedAt 字段
});

const User = mongoose.model('User', userSchema);

User.create({ name: '张三' }).then(user => {
  console.log(user._id); // 这里的 _id 就是一个新的 ObjectId
});
自定义 ObjectId

如果需要自定义 ObjectId,可以传入一个 12 字节的 Buffer 数组。这个 Buffer 数组需要满足 MongoDB 对 ObjectId 的定义。例如:

const mongoose = require('mongoose');

const customBuffer = Buffer.alloc(12);
// 设置前 4 个字节为当前时间的时间戳
customBuffer.writeUInt32BE(Math.floor(Date.now() / 1000), 0);
// 设置 5-12 字节为随机数
for (let i = 4; i < 12; i++) {
  customBuffer[i] = Math.floor(Math.random() * 256);
}

const customId = new mongoose.Types.ObjectId(customBuffer);
console.log(customId); // 输出一个自定义的 ObjectId
总结

使用 Mongoose 的 ObjectId 类可以轻松地生成新的 _id 或者自定义 _id。在定义 Mongoose 模型时,也可以将 _id 设置为默认的 ObjectId 类型。