【问题标题】:Is there any way to create mongodb like _id strings without mongodb?有没有办法在没有 mongodb 的情况下创建像 _id 字符串一样的 mongodb?
【发布时间】:2012-05-15 02:07:10
【问题描述】:

我真的很喜欢 mongodb 生成的 _ids 的格式。主要是因为我可以从客户端提取日期等数据。我打算使用另一个数据库,但我的文档仍然需要那种类型的 _id。如何在不使用 mongodb 的情况下创建这些 id?

谢谢!

【问题讨论】:

  • 我想知道我们是否可以在其他编程语言,特别是 Java 和 C 中生成类似 mongodb 的对象 id

标签: javascript node.js mongodb couchdb database


【解决方案1】:

一个非常简单的javascript伪ObjectId生成器:​​

const ObjectId = (m = Math, d = Date, h = 16, s = s => m.floor(s).toString(h)) =>
    s(d.now() / 1000) + ' '.repeat(h).replace(/./g, () => s(m.random() * h))

【讨论】:

  • mongoose.Types.ObjectId.isValidtrue
  • 如果你已经有mongoose.Types,那么你也可以拨打new mongoose.Types.ObjectId()
【解决方案2】:

我有一个生成ObjectIds 的浏览器客户端。我想确保在客户端中使用与服务器中使用的相同的ObjectId 算法。 MongoDB 有 js-bson 可用于完成此操作。

如果你在 node 中使用 javascript。

npm install --save bson

使用 require 语句

var ObjectID = require('bson').ObjectID;

var id  = new ObjectID();
console.log(id.toString());

使用 ES6 导入语句

import { ObjectID } from 'bson';

const id  = new ObjectID();
console.log(id.toString());

该库还允许您使用良好的旧脚本标签进行导入,但我没有尝试过。

【讨论】:

  • 我使用 id.toHexString() 来获取字符串。
  • 这应该是正确的答案...使用与 MongoDB 相同的代码!我正在使用 bson 4.0.2,它对我来说工作得很好。注意名称是“ObjectId”(小写D)
【解决方案3】:

对象 ID 通常由客户端生成,因此任何 MongoDB 驱动程序都会有代码来生成它们。

如果您正在寻找 JavaScript,这里有一些来自 MongoDB Node.js 驱动程序的代码:

https://github.com/mongodb/js-bson/blob/1.0-branch/lib/bson/objectid.js

还有一个更简单的解决方案:

https://github.com/justaprogrammer/ObjectId.js

【讨论】:

【解决方案4】:

以更易读的语法 (KISS) 扩展 Rubin Stolk 和 ChrisV 的答案。

function objectId () {
  return hex(Date.now() / 1000) +
    ' '.repeat(16).replace(/./g, () => hex(Math.random() * 16))
}

function hex (value) {
  return Math.floor(value).toString(16)
}

export default objectId

【讨论】:

    【解决方案5】:

    ruben-stolk 的回答很好,但故意不透明?比较容易区分的是:

    const ObjectId = (rnd = r16 => Math.floor(r16).toString(16)) =>
        rnd(Date.now()/1000) + ' '.repeat(16).replace(/./g, () => rnd(Math.random()*16));
    

    (实际上字符数略少)。不过还是赞一个!

    【讨论】:

      【解决方案6】:

      这是一个生成新objectId的简单函数

      newObjectId() {
          const timestamp = Math.floor(new Date().getTime() / 1000).toString(16);
          const objectId = timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, () => {
              return Math.floor(Math.random() * 16).toString(16);
          }).toLowerCase();
      
          return objectId;
      }
      

      【讨论】:

        【解决方案7】:

        这里是a link!去图书馆做这件事。

        https://www.npmjs.com/package/mongo-object-reader 可以读写十六进制字符串。

        const { createObjectID, readObjectID,isValidObjectID }  = require('mongo-object-reader');
        //Creates a new immutable `ObjectID` instance based on the current system time.
        const ObjectID =  createObjectID() //a valid 24 character `ObjectID` hex string.
        
        //returns boolean
        // input - a valid 24 character `ObjectID` hex string.
        const isValid = isValidObjectID(ObjectID) 
        
        //returns an object with data
        // input - a valid 24 character `ObjectID` hex string.
        const objectData  = readObjectID(ObjectID) 
        
        console.log(ObjectID) //ObjectID
        console.log(isValid)       // true
        console.log(objectData)    /*
        { ObjectID: '5e92d4be2ced3f58d92187f5',
          timeStamp:
           { hex: '5e92d4be',
             value: 1586681022,
             createDate: 1970-01-19T08:44:41.022Z },
          random: { hex: '2ced3f58d9', value: 192958912729 },
          incrementValue: { hex: '2187f5', value: 2197493 } }
        */
        

        【讨论】:

          【解决方案8】:

          这里有详细的规范

          http://www.mongodb.org/display/DOCS/Object+IDs

          您可以使用它来滚动您自己的 id 字符串

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-14
            • 2017-07-16
            • 2012-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-23
            • 1970-01-01
            相关资源
            最近更新 更多