2016-07-10 4 views
3

При создании нового ObjectId в моем Node.js сценарии с помощью:Mongojs.ObjectId() производит неправильную метку времени

mongojs.ObjectId() 

Я получаю _id как

“f5818257dd0b55ce321f87b5” 

Когда я использую:

mongojs.ObjectId(“f5818257dd0b55ce321f87b5”).getTimestamp() 

я получаю:

“Sun Jul 10 2016 19:12:21 GMT+0200 (CEST)" 

Но когда я использую ObjectId("f5818257dd0b55ce321f87b5").getTimestamp() в MongoDB Shell я получаю:

ISODate("2100-07-10T12:23:51Z") 

Когда я хочу, чтобы отсортировать мои документы по _id с:

db.stores.find().sort({_id: -1}) 

документы возвращаются в неправильном порядке, поскольку метка времени в ObjectId неверна.

Как получить mongojs для производства ObjectIds в правильном формате?

Я действительно смущен, может ли кто-нибудь мне помочь?

Edit: Когда я вставляю документ с mongojs я получаю ObjectId как:

“30a282576f9f2c4772e69cd9” 

Когда я получаю временную метку с:

ObjectId("30a282576f9f2c4772e69cd9").getTimestamp() 

возвращает:

ISODate("1995-11-09T22:36:07Z") 

Но когда я вставляю документ с помощью оболочки MongoDB, я получаю ObjectId вроде:

“5782a4809f3c4cbed9f2a8a1” 

Когда я получаю временную метку из этого идентификатора с помощью:

ObjectId("5782a4809f3c4cbed9f2a8a1").getTimestamp() 

я получаю:

ISODate("2016-07-10T19:39:44Z") 

Эти два документа созданы как 5 минут друг от друга. Почему дата в ObjectId вставлена ​​с mongojs неправильно?

+1

Какая версия драйвера MongoDB Node.js вы используете? Я могу воспроизвести это неправильное поведение с драйвером узла 2.2.0 (и поднял https://jira.mongodb.org/browse/NODE-749), но версии 2.1.21 и старше выглядят нормально. – Stennie

+1

Спасибо, я действительно использовал mongodb 2.2.0 i, обновленный до 2.2.1, и теперь он работает, как и ожидалось. –

ответ

1

Проблема решена Я использовал версию 2.2.0 драйвера узла MongoDB после обновления до более новой версии, все работает так, как ожидалось.

4

На самом деле это не ответ, потому что я не знаю, кто виноват или как правильно его исправить, но причина связана с различными порядками байтов.

Взяв ваш пример 30a282576f9f2c4772e69cd9 и включив его (см. Ниже), вы получите 5782a230472c9f6fd99ce672, который правильно интерпретируется в оболочке MongoDB.

Вот код:

let buf1 = Buffer.from('30a282576f9f2c4772e69cd9', 'hex'); 
let buf2 = Buffer.alloc(buf1.length); 

[ 0, 4, 8 ].forEach(o => buf2.writeUInt32LE(buf1.readUInt32BE(o, 4), o)); 

console.log(buf1.toString('hex')); 
console.log(buf2.toString('hex')); 

Я не думаю, что он должен делать с mongojs, потому что это только с использованием официального драйвер MongoDB узла.

Смежные вопросы