【问题标题】:Create ObjectId in mongoose using a seed string使用种子字符串在猫鼬中创建 ObjectId
【发布时间】:2013-03-24 17:00:12
【问题描述】:

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

Id = new ObjectId("alex"); 

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

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

【问题讨论】:

    标签: javascript node.js mongodb mongoose nosql


    【解决方案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));
        }
        

        【讨论】:

          猜你喜欢
          • 2016-11-21
          • 2020-10-23
          • 2020-10-25
          • 2016-01-01
          • 1970-01-01
          • 2013-07-27
          • 2018-08-20
          • 2017-10-24
          • 2021-01-08
          相关资源
          最近更新 更多