Я создал временных меток один за другим и получил эти:
ObjectId("586a291570b9a181fc2f61ba").getTimestamp();
ISODate("2017-01-02T10:19:01Z")
Для следующей временной метки:
ObjectId("586a291570b9a181fc2f61bc").getTimestamp();
ISODate("2017-01-02T10:19:01Z")
Вы заметите, что, хотя только зернистость печатается getTimestamp()
в секундах, там является дополнительной детализацией, которая вызывает изменение строки ObjectId, хотя оба они находятся на 01
секунд.
The reason:
BSON has a special timestamp type for internal MongoDB use and is not associated with the regular Date type. Timestamp values are a 64 bit value where:
the first 32 bits are a time_t value (seconds since the Unix epoch)
the second 32 bits are an incrementing ordinal for operations within a given second.
Within a single mongod instance, timestamp values are always unique.
Таким образом, истинная зернистость в терминах 32 битном порядкового генерируемой MongoDB. Это связано с operations within a second
, а не значением времени, поэтому вы не получаете его в миллисекундах.
Это несчастливо. Причина, по которой я использую отметку времени Монго, заключается в том, что я думаю, что мой узел узла работает на моем сервере на двух разных машинах, что означает, что Date.now() в одном запросе может быть на самом деле больше времени, чем в следующем. Монго был способом централизовать это время. Есть ли еще один централизованный источник, который мог бы получить время с миллисекундной точностью, которая не будет страдать от потенциально наличия двух разных серверов узлов? –
Я использовал другой способ получить то же самое от процесса mongod. private Дата getDBTime() { return (Date) db.eval ("function() {return new Date()}"); } –
db.eval ("function() {return new Date()}") выдает сообщение об ошибке «undefined is not a function». Я получаю db следующим образом: var db = mongoose.connect (connectionString) .connection.db; До сих пор это выглядит правильно? –