Преобразование хранимой даты 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()
}