【问题标题】:How to generate unique object id in mongodb如何在 mongodb 中生成唯一的对象 ID
【发布时间】:2017-03-19 02:00:35
【问题描述】:

当我在 Java 中使用 Mongodb 时,我想在客户端生成 Object id。但是,在插入记录之前,我必须先查询 mongodb 以确保 ObjectId() 方法生成的 id 是唯一的。有什么方法可以在不访问 mongodb 两次的情况下生成唯一的对象 ID?

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    您可以在客户端生成 ObjectId 而无需咨询数据库。这样的 ID 将是唯一的(您必须非常努力地获得两个相同的对象 ID)。

    ObjectId id = new ObjectId();
    
    // or this
    ObjectId id = ObjectId.get();
    

    【讨论】:

    • 没有区别。 ObjectId#get 只是调用构造函数。
    • @Jennifer:这是java,不是javascript。
    • 在具有 dockered 进程(相同 PID)的高度并发设置中,此过程可能很危险,导致 ID 冲突。非常不可能并且对“NetworkInterface.getNetworkInterfaces()”的调用必须失败,从而导致 ID 的随机机器部分。但你不能确定,对吧?
    • @AndréB。嗯,你是什么意思,同一个pid? (我不知道码头工人:))
    • 在 docker 容器中,PIDs 从零开始,尝试运行“docker run ubuntu ps ax”。
    【解决方案2】:

    对象 ID 与您在 RDMS 中使用的顺序 ID 不同。如果它们是根据Object ID specification 正确生成的,则您无需担心它们是唯一的。

    您所要做的就是确保始终创建一个新的对象 ID 而不是重复使用它们。

    【讨论】:

    • 所以如果我通过以下方式生成 id: ObjectId id = new ObjectId();那么 id 必须已经是唯一的了?谢谢
    • @vienna 正确。您只需确保每次将记录保存到数据库时都调用它。
    【解决方案3】:

    从 MongoDB Java Driver 3.3.0 开始,ObjectId 的创建方式有以下几种。

    使用不带参数的构造函数: 提供唯一的ObjectId

    1. ObjectId id1 = new ObjectId(); //Generates unique id 
    
        1.1. ObjectId id2 = ObjectId.get(); //Calls new ObjectId();
    

    使用参数化构造函数: 参数影响ObjectId的唯一性

    2. public ObjectId(byte[] bytes) // Receives a byte array of size 12.
    
    3. public ObjectId(String hexString) //Receives a String that is a hexadecimal representation of 12 bytes.
    
    4. public ObjectId(Date date) // Receives a Date object
    
    5. public ObjectId(Date date, int counter) //Receives date and a counter
    
    6. public ObjectId(Date date,
                int machineIdentifier,
                short processIdentifier,
                int counter) //Receives Date, MachineId, PID and counter.
    
    7. public ObjectId(int timestamp,
                int machineIdentifier,
                short processIdentifier,
                int counter) //Receives Epoch time in sec, MachineId, PID and counter.
    

    了解 ObjectId:

    ObjectId由12个字节组成,划分如下:

                   ObjectID layout
    
    0   1   2   3   4   5   6   7   8   9   10  11
    
    |time          |machine    |pid    |inc      |
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多