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?

Liatz
źródło

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

drinchev
źródło
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.

bobbyz
źródło
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);
cegprakash
źródło
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
6
var ItemSchema = new Schema({
    name : { type: String }
});

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

Dokumenty: https://mongoosejs.com/docs/guide.html#timestamps

Nikolay_R
źródło
3
Moglibyśmy po prostu przekazać { timestamps: true }jako drugi argument new Schema({}, {<here>}).
jet_choong
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

Fletch
źródło
-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.

shengsheng
źródło
Jest wbudowany w Mongoose, więc unikaj używania wtyczek
Simon Dragsbæk