マングースのどのSchemaTypeがタイムスタンプに最適ですか?


83

私はMongoose、MongoDB、およびNodeを使用しています。

フィールドの1つがdate \ timestampであるスキーマを定義したいと思います。

過去5分間に更新されたすべてのレコードを返すために、このフィールドを使用したいと思います。

MongooseではTimestamp()メソッドを使用できないため、次のJavascriptメソッドを使用するしか選択肢がないことを理解しています。

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

これは、巨大なDBをクエリするための最も効率的な方法ではない可能性があります。誰かがこれを実装するより効率的な方法を共有できれば本当にありがたいです。

これをMongooseで実装し、MongoDBタイムスタンプを使用できるようにする方法はありますか?

回答:


135

編集-2016年3月20日

Mongooseは、コレクションのタイムスタンプをサポートするようになりました

以下の@bobbyz回答を検討してください。多分これはあなたが探しているものです。

元の回答

マングースは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)}
Liatz 2012

1
@ user1103897 Dateオブジェクトを直接作成し、次のように$ gtで使用できます。varnow= new Date(); var fiveminago = new Date(now.getTime()-5 * 60 * 1000); 次に、{date:{$ gt:fiveminago}}でクエリを実行します
mpobrien 2012

19
おそらくのDate.now代わりになりDate.now()ます。
Aleksei Zabrodskii 2012

1
1 elmigranto、マングースドキュメントの例では、Date.nowの使用mongoosejs.com/docs/guide.htmlを
アーロン

19
説明:は、オブジェクトを作成するときに実行される関数だDate.nowからDate.nowです。Date.now()あなたmodels.jsが解析された日付です。つまり、Date.now()すべてのオブジェクトを使用すると、同じ日付になり、それmodels.jsが解析された日付になります。
mikemaccana 2014年

115

現在のバージョンのMongoose(v4.x)には、スキーマの組み込みオプションとしてタイムスタンプがあります。

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

このオプションはcreatedAtupdatedAtタイムスタンプが付けられ、Dateすべての作業を実行するプロパティを追加します。ドキュメントを更新するたびに、updatedAtプロパティが更新されます。スキーマタイムスタンプドキュメント。


3
ありがとうございます。ドキュメントではtimestamps: true、を使用して名前を上書きする代わりに使用できることが明確ではありませんでしたtimestamps: {...}
タール

2
@tarまだ機能していると思いますが、4.xのドキュメントでは特に言及されてtimestamps: trueいたため、今後、いくつかの追加の考慮事項が必要になる可能性があります。(多分彼らはそれを非推奨にしているのでしょうか?そうです、ドキュメントはこのオプションについてあまり明確ではありません。)
bobbyz19年

14

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);

1
ありがとうございました!!!これはとても役に立ちました。ドキュメントを検索していましたが、これを行う方法が見つかりませんでした。共有していただきありがとうございます。
グレッグ


0

過去5分間に更新されたすべてのレコードを返すために、このフィールドを使用したいと思います。

これは、オブジェクトを保存するたびに日付を「今」に更新する必要があることを意味します。たぶんあなたはこれが役に立つと思うでしょう:Moongoosecreate-modifiedプラグイン


-2

最初 : 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

時間はこの形式です。


そうなプラグインを使用しないようマングースに組み込まれている
サイモンDragsbæk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.