我想使用种子字符串在猫鼬中创建一个objectid,例如-
Id = new ObjectId("alex");
类似的东西。但是我看到的任何生成 objectid 的示例都要求您以 objectid 的哈希格式传入字符串。
有没有办法做我想做的事?
我想使用种子字符串在猫鼬中创建一个objectid,例如-
Id = new ObjectId("alex");
类似的东西。但是我看到的任何生成 objectid 的示例都要求您以 objectid 的哈希格式传入字符串。
有没有办法做我想做的事?
ObjectIds 不接受种子。如果您只想为您的文档自定义 _id,您可以在架构中将它们声明为字符串、数字等。
Schema({ _id: String })
如果有人仍在寻找解决方案,以下要点可能会有所帮助。
import mongoose from "mongoose";
import RandomGenerator from "random-seed-generator";
const mockIt = (modifier = Math.random()) => {
let mock = RandomGenerator.createWithSeeds("Mock" + modifier).hexString(24);
return mock;
};
export const mockObjectId = (str, options) => {
const { plainText = false } = options || {};
const id = mongoose.Types.ObjectId(mockIt(str));
return plainText ? id.toString() : id;
};
您可以使用此代码
/**
* https://docs.mongodb.com/manual/reference/method/ObjectId/
* @param seed - string allowing to create predictable mongo id value ( the same for any execution )
* @param date - date of creation - first 4 bytes of id
* @returns {ObjectId}
*/
function mongoIdFromSeed(seed, date = "2022-01-01") {
return new ObjectID(dayjs(date).unix().toString(16) + crypto.createHash("md5").update(seed).digest("hex").substr(0, 16));
}
对于给定的seed
,date
您将随时获得相同的结果。
此代码取决于库dayjs
,您可以使用删除此依赖项
new Date(date).getTime() / 1000 | 0
代替unix
方法。我是说
function mongoIdFromSeed(seed, date = "2022-01-01") {
return new ObjectID((new Date(date).getTime() / 1000 | 0).toString(16) + crypto.createHash("md5").update(seed).digest("hex").substr(0, 16));
}