2017-05-14 13 views
0

Node.jsアプリケーションで、MongoDBコレクションの日付フィールドにTTLインデックスを追加して、指定した日付に期限切れにします。Tongインデックスを使用してMongoDB文書を期限切れにしない

アプリケーションは、getTime()方法を介してミリ秒に変換し、new Date()介して現在の日付を取得したユーザ(有効期限)で指定されたミリ秒数を加算し、setTime()を通じてバック日付フォーマットに結果を変換します。結果は、最終的にMongoDBコレクションに挿入されるJSONオブジェクトのexpireAtという名前のフィールドに保存されます。

結果は、現在の日付に追加された有効期限に合わせて調整されたUTCタイムゾーンに従った日付を正確に表しているように見えます。たとえば、 expireAt: "2017-05-14T13:59:01.998Z"(約13:00 UTCに1時間の有効期限で挿入された)。

collection.createIndex({"expireAt": 1}, {expireAfterSeconds: 0, name: "_exp"}); 

これは、しかし、私にMongoError: Values in the index key pattern cannot be 0エラーを与え、何のインデックスが作成されませんでしたので、私はに切り替え:

はTTLインデックスを追加するには、私は自分のノード・アプリケーションに以下の行を追加しました
collection.createIndex({"expireAt": 1}, {expireAfterSeconds: 1, name: "_exp"}); 
私はその後、 expireAt金融商品取引法で文書を挿入するために進め

この時、私はそれを実行したときに、インデックスが作成された、as I could see using MongoDB Compass

例えばexpireAt: "2017-05-14T13:59:01.998Z"で説明されているようなd。しかし、文書が期限切れになっていてはいないはずです。さらに、上の図は、TTLインデックスの使用率が0であることを示しています。これは、何らかの理由で挿入された新しいドキュメントがexpireAtフィールドを持っていてもそのインデックスを使用していないことを示しています。

さらに、MongoDBコンパスは、expireAtフィールドの内容を、特定のBSON日付タイプの代わりにタイプ文字列として表示します。しかし、コンパスのものなのかどうかはわかりません。フィールド型をString、Object、またはArray以外のものに編集することはできません。

紛失したり、似たような問題に遭遇して誰かが魂を見つけたことがありますか?私は似たような質問で解決策を探してみました。

+1

私はちょうどデシベルに書き込む前に '')( ''新しい日付の値を包み、今、それが正しく日付形式や文書と一緒に保存されていますが正しく期限切れにしているようです。オブジェクトがJSONとして保存され、HTTPリクエストの本文に送信されたという事実と関係していたようです。 –

答えて

1

問題はフィールドの種類と関連しているようです。 TTL索引フィールドは日付タイプでなければなりません。文書内のインデックスフィールドが日付または 日付値(単数または複数)を保持している配列ではない場合https://docs.mongodb.com/manual/core/index-ttl/

、文書が期限切れではないであろう。

新しいDateオブジェクトを持つドキュメントを作成することを検討する必要があります。

"expireAt" : new Date("2017-05-14T13:59:01.998Z")

+0

答えをありがとう。それはまさに私がやったことであり、働くことができませんでした。上記の返信でコメントしたように、問題はJSONに保存し直したためです問題が既に解決されているということを考えれば、私はあなたの答えに合格とマークします。 –

+0

私は答えを投稿すると、あなたのコメントが表示されませんでした。問題が解決されたことをうれしく思います。 –

関連する問題