Преобразование хранимой даты mongo в миллисекундах с момента загрузки Unix при загрузке?

Я использую Mongoose и Node.js для своего веб-сервера.

Как часть одной из моих схем документов, у меня есть поле "timestamp". Строка для нее в схеме: timestamp: { type: Date, default: Date.now }

Это отлично работает и позволяет мне получать документы на основе метки времени, однако это сохраняет формат ISODate, как описано здесь: http://docs.mongodb.org/manual/core/document/#date, как это

"timestamp":"2013-04-04T19:31:38.514Z"

Я не против этого, но я посылаю это клиенту как есть. Это означает, что я должен использовать Date.parse() на стороне клиента, прежде чем выполнять сравнительные операции с ним.

Есть ли способ сохранить дату как целое число или автоматически преобразовать ее в единицу при ее получении?

Есть ли какая-то причина, по которой я должен это делать, и просто иметь дело с ней на стороне клиента?

Спасибо заранее.

Ответ 1

Вы можете добавить числовую миллисекундную версию timestamp в качестве атрибута virtual в схеме:

schema.virtual('timestamp_ms').get(function() {
  return this.timestamp.getTime();
});

Затем вы можете включить включение виртуального поля в вызовы toObject экземпляров модели с помощью опции в вашей схеме:

var schema = new Schema({
  timestamp: Date
}, {
  toObject: { getters: true }
});

Ответ 2

var schema = new Schema({
  timestamp: {type:Number, default: new Date().getTime()}
});

Надеюсь, что это решит вашу проблему.

Ответ 3

Как лучшая практика, я бы сказал: сохранить ваши данные типа, которого он заслуживает.

В любом случае, если вашему клиенту нужно обрабатывать номера, вы можете просто передать дату в миллисекундах клиенту и по-прежнему работать с объектами Date в Node.

Просто позвоните timestamp.getTime() и ta-da, у вас установлена ​​ваша временная метка unix для клиента.

Ответ 4

Это отлично работает для меня

db.eurusd.ticks.findOne({_id:ObjectId("518636777055000000000000")}).t.getTime()

возвращает время в миллисекундах, где возвращаемый документ имеет структуру

{
 "_id" : ObjectId("518636777055000000000000"),
 "t" : ISODate("2013-05-05T10:37:43Z"), // date data type
 "ask" : "Joe",
 "bid" : 33
}

Ответ 5

когда вы устанавливаете тип mongoose как "Date", mongoose конвертирует метку времени в UTC, потому что метка времени - это число, а не дата. затем, если вы хотите сохранить метку времени, вы должны установить тип мангусты как "Число".

myfield{
    type: Number,
    default: Date.now()
}