2016-07-10 9 views
3

Wenn Sie ein neues ObjectId in meinem node.js Skript erstellen, mit:Mongojs.ObjectId() erzeugt falschen Zeitstempel

mongojs.ObjectId() 

ich eine _id wie

“f5818257dd0b55ce321f87b5” 

bekommen Wenn ich benutze:

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

ich:

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

Aber wenn ich ObjectId("f5818257dd0b55ce321f87b5").getTimestamp() in der MongoDB Shell verwenden, erhalte ich:

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

Als ich von _id meine Dokumente sortieren möchten mit:

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

Die Dokumente werden in der falschen Reihenfolge zurückgegeben, da die Timestamp in der ist falsch.

Wie bekomme ich Mongojs ObjectIds im richtigen Format zu produzieren?

Ich bin wirklich verwirrt, kann mir jemand helfen?

Edit: Wenn ich ein Dokument mit mongojs einfügen erhalte ich eine ObjectId wie:

“30a282576f9f2c4772e69cd9” 

Wenn ich den Zeitstempel mit:

ObjectId("30a282576f9f2c4772e69cd9").getTimestamp() 

Es gibt:

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

Aber wenn ich ein Dokument mit der MongoDB Shell einfüge bekomme ich eine ObjectId wie:

“5782a4809f3c4cbed9f2a8a1” 

Wenn ich den Zeitstempel dieser ID erhalten mit:

ObjectId("5782a4809f3c4cbed9f2a8a1").getTimestamp() 

ich:

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

Diese beiden Dokumente werden wie 5 min auseinander geschaffen. Warum ist das Datum in der ObjectId falsch mit mongojs eingefügt?

+1

Welche Version des MongoDB Node.js-Treibers verwenden Sie? Ich kann dieses falsche Verhalten mit dem 2.2.0 Node-Treiber reproduzieren (und https://jira.mongodb.org/browse/NODE-749), aber 2.1.21 und ältere Versionen scheinen in Ordnung zu sein. – Stennie

+1

Danke ich war in der Tat mit mongodb 2.2.0 Ich aktualisierte auf 2.2.1 und jetzt funktioniert es wie erwartet. –

Antwort

1

Problem gelöst Ich habe die Version 2.2.0 des MongoDB Node-Treibers verwendet, nach der Aktualisierung auf eine neuere Version funktioniert alles wie erwartet.

4

Das ist nicht wirklich eine Antwort, weil ich nicht weiß, wer Schuld hat oder wie man es richtig repariert, aber die Ursache liegt an verschiedenen Byte-Ordnungen.

Wenn Sie Ihr 30a282576f9f2c4772e69cd9 Beispiel verwenden und die Endianity darauf umschalten (siehe unten), erhalten Sie 5782a230472c9f6fd99ce672, was in der MongoDB-Shell korrekt interpretiert wird.

Hier ist der Code:

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')); 

Ich glaube nicht, dass es mit mongojs zu tun hat, denn das ist nur die offiziellen MongoDB Node-Treiber.

Verwandte Themen