Welcher SchemaType in Mongoose eignet sich am besten für den Zeitstempel?

84

Ich benutze Mongoose, MongoDB und Node.

Ich möchte ein Schema definieren, in dem eines seiner Felder ein Datum \ Zeitstempel ist.

Ich möchte dieses Feld verwenden, um alle Datensätze zurückzugeben, die in den letzten 5 Minuten aktualisiert wurden.

Aufgrund der Tatsache, dass ich in Mongoose die Timestamp () -Methode nicht verwenden kann, verstehe ich, dass meine einzige Option darin besteht, die folgende Javascript-Methode zu verwenden:

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

Dies ist wahrscheinlich nicht die effizienteste Methode zum Abfragen einer riesigen Datenbank. Ich würde es wirklich begrüßen, wenn jemand einen effizienteren Weg zur Umsetzung teilen könnte.

Gibt es eine Möglichkeit, dies mit Mongoose zu implementieren und einen MongoDB-Zeitstempel zu verwenden?

Liatz
quelle

Antworten:

137

Bearbeiten - 20. März 2016

Mungo unterstützt jetzt Zeitstempel für Sammlungen .

Bitte beachten Sie die Antwort von @bobbyz unten . Vielleicht ist es das, wonach Sie suchen.

Ursprüngliche Antwort

Mungo unterstützt einen DateTyp (der im Grunde ein Zeitstempel ist):

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

Mit der obigen Felddefinition timefüllt Mongoose jedes Mal, wenn Sie ein Dokument mit einem nicht festgelegten Feld speichern , dieses Feld mit der aktuellen Uhrzeit aus.

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

drinchev
quelle
Vielen Dank für die Antwort, aber was ich zu verstehen versuche, ist der beste Weg, um die Rückgabe aller Datensätze abzufragen, die in den letzten 5 Minuten aktualisiert wurden. Meinst du, ich sollte verwenden: Datum: {$ gt: ((Math.round ((neues Datum ()). GetTime () / 1000)) - 300)}
Liatz
1
@ user1103897 Sie können ein Date-Objekt direkt erstellen und mit $ gt wie folgt verwenden: var now = new Date (); var fiveminago = neues Datum (now.getTime () - 5 * 60 * 1000); dann Abfrage mit {Datum: {$ gt: fiveminago}}
mpobrien
19
Sollte wohl Date.nowstatt sein Date.now().
Aleksei Zabrodskii
1
+1 elmigranto, Mongoose docs Beispiel verwendet Date.now mongoosejs.com/docs/guide.html
Aaron
19
Erläuterung: Date.nowweil Date.nowist eine Funktion, die ausgeführt wird, wenn Sie Objekte erstellen. Date.now()ist das Datum, an dem Sie models.jsanalysiert wurden. Das heißt, wenn Sie Date.now()alle Ihre Objekte verwenden, haben sie das gleiche Datum, und das ist das Datum, an dem sie models.jsanalysiert wurden.
Mikemaccana
120

Die aktuelle Version von Mongoose (v4.x) verfügt über eine Zeitstempelung als integrierte Option für ein Schema:

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

Durch diese Option wird createdAtund updatedAtEigenschaften , die mit einem Zeitstempel versehen werden Date, und die die ganze Arbeit für Sie. Jedes Mal, wenn Sie das Dokument aktualisieren, wird die updatedAtEigenschaft aktualisiert . Schema-Zeitstempel-Dokumente.

Bobbyz
quelle
4
Vielen Dank, die Dokumente waren nicht klar, dass man verwenden könnte, timestamps: trueanstatt die Namen mit zu überschreiben timestamps: {...}.
Teer
2
@tar Ich gehe davon aus, dass es immer noch funktioniert, aber in den 4.x-Dokumenten wurde dies ausdrücklich erwähnt timestamps: true, sodass in Zukunft möglicherweise einige zusätzliche Überlegungen erforderlich sind. (Vielleicht lehnen sie es ab? Sie haben Recht, die Dokumente sind für diese Option nicht sehr klar.)
Bobbyz
18

Falls Sie benutzerdefinierte Namen für "createdAt" und "updatedAt" wünschen

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

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

const mySchema = new Schema({ name: String }, schemaOptions);
Cegprakash
quelle
1
Vielen Dank!!! Das war super hilfreich. Durchsuchte die Dokumentation, konnte aber nicht finden, wie das geht. Nochmals vielen Dank für das Teilen.
Greg
6
var ItemSchema = new Schema({
    name : { type: String }
});

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

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

Nikolay_R
quelle
3
Wir könnten das { timestamps: true }als zweites Argument einfach weitergeben new Schema({}, {<here>}).
jet_choong
0

Ich möchte dieses Feld verwenden, um alle Datensätze zurückzugeben, die in den letzten 5 Minuten aktualisiert wurden.

Dies bedeutet, dass Sie das Datum jedes Mal, wenn Sie das Objekt speichern, auf "Jetzt" aktualisieren müssen. Vielleicht finden Sie dies nützlich: Moongoose-Plugin zum Erstellen von Modifikationen

Befiedern
quelle
-3

Zuerst : npm install mongoose-timestamp

Nächster: let Timestamps = require('mongoose-timestamp')

Nächster: let MySchema = new Schema

Nächster: MySchema.plugin(Timestamps)

Nächster : const Collection = mongoose.model('Collection',MySchema)

Dann können Sie das Collection.createdAtoder Collection.updatedAtüberall verwenden, wo Sie wollen.

Erstellt am: Datum der Woche Monat Datum Jahr 00:00:00 GMT

Die Zeit ist in diesem Format.

Shengsheng
quelle
Es ist in Mongoose integriert, also vermeiden Sie die Verwendung von Plugins
Simon Dragsbæk