Який тип 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.