Який тип SchemaType в Mongoose найкращий для позначки часу?


86

Я використовую Mongoose, MongoDB та Node.

Я хотів би визначити схему, де одним із її полів є мітка дати \ часу.

Я хотів би використати це поле, щоб повернути всі записи, оновлені за останні 5 хвилин.

Через те, що в Mongoose я не можу використовувати метод Timestamp (), я розумію, що єдиним варіантом є використання наступного методу Javascript:

time : { type: Number, default: (new Date()).getTime() } 

Це, мабуть, не найефективніший спосіб запитувати величезну БД. Я був би дуже вдячний, якби хтось міг поділитися більш ефективним способом реалізації цього.

Чи є спосіб реалізувати це за допомогою Mongoose і мати можливість використовувати мітку часу MongoDB?

Відповіді:


139

Редагувати - 20 березня 2016 року

Mongoose тепер підтримує мітки часу для колекцій .

Будь ласка, розгляньте відповідь @bobbyz нижче . Можливо, це те, що ви шукаєте.

Оригінальна відповідь

Mongoose підтримує Dateтип (який в основному є міткою часу):

time : { type : Date, default: Date.now }

З наведеним вище визначенням поля, щоразу, коли ви зберігаєте документ із невстановленим timeполем, Mongoose заповнює це поле поточним часом.

Джерело: http://mongoosejs.com/docs/guide.html


Щиро дякую за відповідь, але те, що я намагаюся зрозуміти, є найкращим способом запиту на повернення всіх записів, оновлених за останні 5 хвилин. Ви маєте на увазі, що мені слід використовувати: date: {$ gt: ((Math.round ((new Date ()). GetTime () / 1000)) - 300)}
— Liatz,

1
@ user1103897 ви можете безпосередньо створити об'єкт Date і використовувати його з $ gt так: var now = new Date (); var fiveminago = нова дата (now.getTime () - 5 * 60 * 1000); потім запит із {date: {$ gt: fiveminago}}
— mpobrien

20
Мабуть, має бути Date.nowзамість Date.now().
— Олексій Забродський

1
+1 elmigranto, приклад документа Mongoose використовує Date.now mongoosejs.com/docs/guide.html
— Аарон

21
Пояснення: Date.nowтому Date.now, що це функція, яка запускатиметься під час створення об’єктів. Date.now()це дата, коли ваш models.jsаналіз відбувся. Тобто, якщо ви використовуєте Date.now()всі свої об'єкти, буде однакова дата, і це буде дата models.jsсинтаксичного аналізу.
— mikemaccana

122

Поточна версія Mongoose (v4.x) має штампування часу як вбудований параметр у схему:

var mySchema = new mongoose.Schema( {name: String}, {timestamps: true} );

Цей параметр додає createdAtта updatedAtвластивості, позначені часом, які виконують Dateвсю роботу за вас. Щоразу, коли ви оновлюєте документ, він оновлює updatedAtвластивість. Схема міток часу Документи.


4
Дякую, документи не були чіткими, які можна було б використовувати timestamps: trueзамість того, щоб замінювати імена timestamps: {...}.
— смола

2
@tar Я припускаю, що це все ще працює, але в документах 4.x раніше спеціально згадувалось timestamps: true, тому в майбутньому можуть бути необхідні додаткові міркування. (Можливо, вони це припиняють? Ви маєте рацію, документи не дуже зрозумілі для цього варіанту.)
— bobbyz

19

Якщо вам потрібні власні імена для вашого createdAt та updatedAt

const mongoose = require('mongoose');  
const { Schema } = mongoose;

const schemaOptions = {
  timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' },
};

const mySchema = new Schema({ name: String }, schemaOptions);

1
Дякую!!! Це було дуже корисно. Шукав документацію, але не міг знайти, як це зробити. Ще раз спасибі за обмін.
— Грег


0

Я хотів би використовувати це поле, щоб повернути всі записи, оновлені за останні 5 хвилин.

Це означає, що вам потрібно оновлювати дату до "зараз" кожного разу, коли ви зберігаєте об'єкт. Можливо, вам стане в нагоді це: Moongoose create-Modified plugin


-3

Спочатку : npm install mongoose-timestamp

Далі: let Timestamps = require('mongoose-timestamp')

Далі: let MySchema = new Schema

Далі: MySchema.plugin(Timestamps)

Далі: const Collection = mongoose.model('Collection',MySchema)

Тоді ви можете використовувати Collection.createdAtабо Collection.updatedAtде завгодно.

Створено: Дата тижня Місяць Дата Рік 00:00:00 GMT

Час у такому форматі.


Він вбудований у Mongoose, тому уникайте використання плагінів
— Саймон Драгсбек,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.