使用种子字符串在猫鼬中创建 ObjectId
Posted
技术标签:
【中文标题】使用种子字符串在猫鼬中创建 ObjectId【英文标题】:Create ObjectId in mongoose using a seed string 【发布时间】:2013-03-24 17:00:12 【问题描述】:我想使用种子字符串在 mongoose 中创建一个 objectid,例如-
Id = new ObjectId("alex");
类似的东西。但是我看到的任何生成 objectid 的示例都要求您以 objectid 的哈希格式传入字符串。
有没有办法做我想做的事?
【问题讨论】:
【参考方案1】:ObjectIds 不接受种子。如果您只想为您的文档自定义 _id,您可以在架构中将它们声明为字符串、数字等。
Schema( _id: String )
【讨论】:
【参考方案2】:如果有人仍在寻找解决方案,以下要点可能会有所帮助。
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;
;
【讨论】:
【参考方案3】:您可以使用此代码
/**
* 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
to 而不是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));
【讨论】:
以上是关于使用种子字符串在猫鼬中创建 ObjectId的主要内容,如果未能解决你的问题,请参考以下文章