Zaman Damgası için Mongoose'daki Hangi SchemaType En İyisidir?


86

Mongoose, MongoDB ve Node kullanıyorum.

Alanlarından birinin tarih \ zaman damgası olduğu bir şema tanımlamak istiyorum.

Son 5 dakika içinde güncellenen tüm kayıtları geri getirmek için bu alanı kullanmak istiyorum.

Mongoose'da Timestamp () yöntemini kullanamadığım için, tek seçeneğimin aşağıdaki Javascript yöntemini kullanmak olduğunu anlıyorum:

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

Muhtemelen devasa bir DB'yi sorgulamanın en etkili yolu değildir. Birisi bunu uygulamanın daha verimli bir yolunu paylaşabilirse gerçekten minnettar olurum.

Bunu Mongoose ile uygulamanın ve MongoDB zaman damgasını kullanmanın bir yolu var mı?

Yanıtlar:


139

Düzenleme - 20 Mart 2016

Mongoose artık koleksiyonlar için zaman damgalarını destekliyor .

Lütfen aşağıdaki @bobbyz cevabını düşünün . Belki aradığınız budur.

Orijinal cevap

Mongoose bir Datetürü destekler (temelde bir zaman damgasıdır):

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

Yukarıdaki alan tanımıyla, bir belgeyi ayarlanmamış bir timealana her kaydettiğinizde, Mongoose bu alanı geçerli zamanla doldurur.

Kaynak: http://mongoosejs.com/docs/guide.html


Cevabınız için çok teşekkür ederim ama anlamaya çalıştığım şey, son 5 dakika içinde güncellenen tüm kayıtları döndürmek için sorgulamanın en iyi yolu. Kullanmam gerektiğini mi söylüyorsunuz: date: {$ gt: ((Math.round ((new Date ()). GetTime () / 1000)) - 300)}
Liatz

1
@ user1103897 doğrudan bir Date nesnesi oluşturabilir ve bunu $ gt ile şu şekilde kullanabilirsiniz: var now = new Date (); var fiveminago = new Date (now.getTime () - 5 * 60 * 1000); sonra {tarih: {$ gt: fiveminago}} ile
sorgula

20
Muhtemelen Date.nowyerine olmalı Date.now().
Aleksei Zabrodskii

1
+1 elmigranto, Mongoose dokümanları örneği Date.now mongoosejs.com/docs/guide.html
Aaron

21
Açıklama: Date.nowçünkü Date.nownesne yaptığınızda çalıştırılacak bir işlevdir. ayrıştırdığınız Date.now()tarihtir models.js. Yani, kullanırsanız Date.now()tüm nesneleriniz aynı tarihe sahip olacak ve bu tarih models.jsayrıştırılmış olacaktır.
mikemaccana

122

Mevcut Mongoose sürümü (v4.x), bir şemaya yerleşik bir seçenek olarak zaman damgasına sahiptir:

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

Bu seçenek , a ile zaman damgası olan ve tüm işi sizin için yapan özellikler createdAtve ekler . Belgeyi her güncellediğinizde, özelliği de günceller . Schema Timestamps Docs.updatedAtDateupdatedAt


4
Teşekkürler, dokümanlar timestamps: true, isimleri geçersiz kılmak yerine kullanılabilecekleri net değildi timestamps: {...}.
Katran

2
@tar Hâlâ çalıştığını varsayıyorum, ancak 4.x belgelerinde özellikle belirtilirdi timestamps: true, bu nedenle ileriye dönük bazı ekstra hususlar olabilir. (Belki de
reddediyorlar

19

Oluşturulan ve güncellenen için özel adlar istemeniz durumunda

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

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

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

1
Teşekkür ederim!!! Bu çok yardımcı oldu. Belgeleri arıyordu, ancak bunun nasıl yapılacağını bulamadım. Paylaştığınız için tekrar teşekkürler.
Greg


0

Son 5 dakika içerisinde güncellenen tüm kayıtları geri getirmek için bu alanı kullanmak istiyorum.

Bu, nesneyi her kaydedişinizde tarihi "şimdi" olarak güncellemeniz gerektiği anlamına gelir. Belki bunu yararlı bulursunuz: Moongoose oluştur-değiştirilmiş eklenti


-3

İlk : npm install mongoose-timestamp

Sonraki: let Timestamps = require('mongoose-timestamp')

Sonraki: let MySchema = new Schema

Sonraki: MySchema.plugin(Timestamps)

Sonraki : const Collection = mongoose.model('Collection',MySchema)

Daha sonra istediğiniz yerde Collection.createdAtveya Collection.updatedAtistediğiniz yerde kullanabilirsiniz .

Oluşturulma Tarihi: Haftanın Tarihi Ay Tarih Yıl 00:00:00 GMT

Zaman bu formattadır.


Mongoose'da yerleşiktir, bu yüzden eklentileri kullanmaktan kaçının
Simon Dragsbæk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.