使用种子字符串在猫鼬中创建 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));

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


此代码依赖于库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的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中删除子文档

Nest.js - 在猫鼬模式中创建索引

如何仅在猫鼬中获取子文档?

如何仅在猫鼬中获取子文档?

我应该在哪里在猫鼬中创建索引

如果不存在但不更新,如何在猫鼬中创建