Który typ SchemaType w Mongoose jest najlepszy dla sygnatury czasowej?


86

Używam Mongoose, MongoDB i Node.

Chciałbym zdefiniować schemat, w którym jednym z jego pól jest data \ znacznik czasu.

Chciałbym użyć tego pola, aby zwrócić wszystkie rekordy, które zostały zaktualizowane w ciągu ostatnich 5 minut.

Ze względu na to, że w Mongoose nie mogę użyć metody Timestamp (), rozumiem, że jedyną opcją jest użycie następującej metody JavaScript:

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

Prawdopodobnie nie jest to najskuteczniejszy sposób przeszukiwania ogromnej bazy danych. Byłbym naprawdę wdzięczny, gdyby ktoś mógł podzielić się skuteczniejszym sposobem realizacji tego.

Czy istnieje sposób na zaimplementowanie tego w Mongoose i możliwość korzystania z sygnatury czasowej MongoDB?

Odpowiedzi:


139

Edycja - 20 marca 2016 r

Mongoose obsługuje teraz sygnatury czasowe kolekcji .

Proszę rozważyć odpowiedź @bobbyz poniżej . Może właśnie tego szukasz.

Oryginalna odpowiedź

Mongoose obsługuje Datetyp (który jest w zasadzie sygnaturą czasową):

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

Przy powyższej definicji pola za każdym razem, gdy zapiszesz dokument z nieustawionym timepolem, Mongoose wypełni to pole aktualnym czasem.

Źródło: http://mongoosejs.com/docs/guide.html


Bardzo dziękuję za odpowiedź, ale staram się zrozumieć, że jest to najlepszy sposób zapytania o zwrócenie wszystkich rekordów, które zostały zaktualizowane w ciągu ostatnich 5 minut. Czy masz na myśli, że powinienem użyć: date: {$ gt: ((Math.round ((new Date ()). GetTime () / 1000)) - 300)}
Liatz

1
@ user1103897 możesz bezpośrednio skonstruować obiekt Date i użyć go z $ gt w następujący sposób: var now = new Date (); var fiveminago = nowa data (now.getTime () - 5 * 60 * 1000); następnie zapytanie z {date: {$ gt: fiveminago}}
mpobrien

20
Powinien Date.nowraczej być zamiast Date.now().
Aleksei Zabrodskii,

1
+1 elmigranto, przykład dokumentów Mongoose używa Date.now mongoosejs.com/docs/guide.html
Aaron

21
Objaśnienie: Date.nowponieważ Date.nowjest to funkcja, która zostanie uruchomiona podczas tworzenia obiektów. Date.now()to data, kiedy models.jszostała przeanalizowana. To znaczy, jeśli użyjesz Date.now()wszystkich swoich obiektów, będą miały tę samą datę i będzie to data, która models.jszostała przeanalizowana.
mikemaccana

122

Bieżąca wersja Mongoose (v4.x) ma znacznik czasu jako wbudowaną opcję schematu:

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

Ta opcja dodaje createdAti updatedAtwłaściwości, które są oznaczone sygnaturą czasową a Datei które wykonują całą pracę za Ciebie. Za każdym razem, gdy aktualizujesz dokument, aktualizuje on updatedAtwłaściwość. Schema Timestamps Docs.


4
Dziękuję, dokumenty nie były jasne, których można użyć timestamps: truezamiast zastępowania nazw za pomocą timestamps: {...}.
tar

2
@tar Zakładam, że nadal działa, ale dokumenty 4.x, o których wspominano konkretnie timestamps: true, mogą być potrzebne dodatkowe uwagi w przyszłości. (Może to deprecjonują? Masz rację, dokumentacja nie jest zbyt jasna dla tej opcji.)
bobbyz

19

Jeśli chcesz mieć niestandardowe nazwy dla twoich createdAt i 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
Dziękuję Ci!!! To było bardzo pomocne. Szukałem dokumentacji, ale nie mogłem znaleźć, jak to zrobić. Jeszcze raz dziękuję za udostępnienie.
Greg


0

Chciałbym użyć tego pola, aby zwrócić wszystkie rekordy, które zostały zaktualizowane w ciągu ostatnich 5 minut.

Oznacza to, że za każdym razem, gdy zapisujesz obiekt, musisz aktualizować datę na „teraz”. Może uznasz to za przydatne: wtyczka Moongoose do tworzenia modyfikacji


-3

Pierwszy : npm install mongoose-timestamp

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

Kolejny: let MySchema = new Schema

Kolejny: MySchema.plugin(Timestamps)

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

Następnie możesz użyć Collection.createdAtlub Collection.updatedAtgdziekolwiek chcesz.

Utworzono: Data tygodnia Miesiąc Data Rok 00:00:00 GMT

Czas jest w tym formacie.


Jest wbudowany w Mongoose, więc unikaj używania wtyczek
Simon Dragsbæk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.