javascriptnode.jsmongodbobjectid

Mongodb get the 3-byte counter from an ObjectId


How/Can I get the

3-byte counter, starting with a random value

part from a mongodb ObjectId?

I have an ObjectId like this: ObjectId("507f1f77bcf86cd799439011")

According to mongodb documentation:

Description

ObjectId() Returns a new ObjectId value. The 12-byte ObjectId value consists of:

a 4-byte value representing the seconds since the Unix epoch,

a 3-byte machine identifier,

a 2-byte process id,

and a 3-byte counter, starting with a random value.

I want to get the "and a 3-byte counter, starting with a random value." part from the ObjectId above if its possible.


Solution

  • You could try the following hack where you can get the equivalent string representation of the ObjectId using toString() or toHexString(), use parseInt and slice to get the parts. Because hex digits are half of a byte the offsets are twice as much:

    db.collection("collectionName").findOne({}, function(err, result) {     
        if (result) {
            var id          = result._id.toString(), ctr = 0;
            var timestamp   = parseInt(id.slice(ctr, (ctr+=8)), 16);
            var machineID   = parseInt(id.slice(ctr, (ctr+=6)), 16);
            var processID   = parseInt(id.slice(ctr, (ctr+=4)), 16);
            var counter     = parseInt(id.slice(ctr, (ctr+=6)), 16);
            console.log(id);
            console.log(timestamp);
            console.log(machineID);
            console.log(processID);
            console.log(counter);                    
        }       
    });