2

我想使用种子字符串在猫鼬中创建一个objectid,例如-

Id = new ObjectId("alex"); 

类似的东西。但是我看到的任何生成 objectid 的示例都要求您以 objectid 的哈希格式传入字符串。

有没有办法做我想做的事?

4

3 回答 3

1

ObjectIds 不接受种子。如果您只想为您的文档自定义 _id,您可以在架构中将它们声明为字符串、数字等。

Schema({ _id: String })
于 2013-04-04T01:20:09.310 回答
0

如果有人仍在寻找解决方案,以下要点可能会有所帮助。

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;
};
于 2021-11-05T11:11:50.283 回答
0

您可以使用此代码

/**
 * 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));
}

对于给定的seeddate您将随时获得相同的结果。


此代码取决于库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));
}
于 2022-02-16T14:02:38.840 回答