Какой тип 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)}
Лиатц,
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свойство. Schema Timestamps Docs.

бобби
источник
4
Спасибо, в документации не было ясно, что можно использовать timestamps: trueвместо переопределения имен с помощью timestamps: {...}.
tar
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);
Cegprakash
источник
1
Спасибо!!! Это было очень полезно. Искал документацию, но не мог найти, как это сделать. Еще раз спасибо за то, что поделились.
Грег
6
var ItemSchema = new Schema({
    name : { type: String }
});

ItemSchema.set('timestamps', true); // this will add createdAt and updatedAt timestamps

Документы: https://mongoosejs.com/docs/guide.html#timestamps

Николай_Р
источник
3
Мы могли бы просто передать в { timestamps: true }качестве второго аргумента new Schema({}, {<here>}).
jet_choong
0

Я хотел бы использовать это поле, чтобы вернуть все записи, которые были обновлены за последние 5 минут.

Это означает, что вам нужно обновлять дату на «сейчас» каждый раз, когда вы сохраняете объект. Может быть, вам это пригодится: плагин для создания и изменения Moongoose

Флетч
источник
-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

Время в этом формате.

Shengsheng
источник
Он встроен в Mongoose, поэтому избегайте использования плагинов
Саймон Драгсбек