Mongodb получает 3-байтовый счетчик из ObjectId

Как / могу я получить

3-байтовый счетчик, начиная со случайного значения

часть из ObjectId mongodb?

У меня есть ObjectId вроде этого: ObjectId (507f1f77bcf86cd799439011)

Согласно документации mongodb:

Описание

ObjectId () Возвращает новое значение ObjectId. 12-байтовое значение ObjectId состоит из:

4-байтовое значение, представляющее секунды с эпохи Unix,

3-байтовый идентификатор машины,

2-байтовый идентификатор процесса,

и 3-байтовый счетчик, начинающийся со случайного значения.

Я хочу получить и 3-байтовый счетчик, начиная со случайного значения., если это возможно, из ObjectId выше.


person kailniris    schedule 18.08.2016    source источник
comment
не могли бы вы уточнить свой вопрос?   -  person rummykhan    schedule 18.08.2016


Ответы (1)


Вы можете попробовать следующий прием, позволяющий получить эквивалентное строковое представление ObjectId с помощью toString() или toHexString(), используйте parseInt и slice, чтобы получить детали. Поскольку шестнадцатеричные цифры составляют половину байта, смещения вдвое больше:

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);                    
    }       
});
person chridam    schedule 18.08.2016
comment
протестировано с 507f1f77bcf86cd799439011 вот результаты: timestamp: 1350508407, machineId: 12384364, processID: 55193, counter: 4427793 Все они хороши, но временная метка 1350508407 не выглядит нормально. новая дата (1350508407) = пятница, 16 января 1970 г., 16:08:28 GMT + 0100 (стандартное романтическое время) - person kailniris; 19.08.2016
comment
Отметка времени не в миллисекундах, вам нужно сначала умножить на 1000, чтобы получить фактическую дату, т.е. new Date(1350508407*1000) = Wed Oct 17 2012 22:13:27 GMT+0100 (GMT Daylight Time) - person chridam; 19.08.2016
comment
по какому принципу сортируются документы? Я вижу, что вся информация идентична для данных, вставленных в большом количестве. - person Akshay Naik; 04.12.2019
comment
Я использую это для счетчика, и я вижу повторяющиеся счетчики для разных идентификаторов. Он должен быть уникальным? - person Stephen Romero; 28.07.2020