2017-12-13 5 views
0

私はキャッシュとしてMongoDB(v3.4)を使用しています。また、TTLインデックスを使用してレコードを失効させています。ただし、TTL設定が正しく動作していないようです。具体的には、データを挿入するためにエンドポイントを使用してテストしました(下記参照)。NodeJSでMongoDB TTLの有効期限が正常に動作しない

エンドポイントmongoInsertは5分で有効期限が切れるはずです。しかし、〜1分後に文書が削除されたようです。私はmoment()。utc()。toDate()を使ったUTC時間の使用に関する他の同様の提案を調べました。その振る舞いは同じでした。新しいDate()はUTC時刻を返したので、同じ結果になるはずです。

他の設定が含まれている必要がありますが、詳細は記載されていませんか。誰もこれの前に遭遇しましたか?

function mongoInsert(mongoClient){ 
    return function(req, res){ 
     mongoClient.connect('mongodb://localhost:27017/cache', function(err, db) { 
      db.collection('data', function(err, collection){ 
       var testItems = [{ 
        "_id": "abc12345", 
        "dmac": "abc", 
        "createdAt": new Date(), 
        "val": { 
         "0": 10, 
         "1": 15, 
         "2": 5 
        }, 
        "res": "minutes", 
        "time": "2017-12-04T00:12:58Z" 
       }]; 
       let unix = new moment().valueOf(); 
       collection.createIndex({createdAt: unix}, {expireAfterSeconds: 300}); 
       collection.insertMany(testItems, function(err, items){ 
        db.close(); 
        res.json(items); 
       }); 
      }) 
     }) 
    } 
} 
+0

ここで言及してくださいMongoDBのバージョン –

+0

私はMongoバージョン3.4を使用しています。 – jlyh

+0

あなたはmongoose.jsを使用していますか? –

答えて

1
collection.createIndex({createdAt: 1}, {expireAfterSeconds: 60,unique:true}); 

collection.createIndex({createdAt: 1}, {expireAfterSeconds: 300,unique:true}); 

これが無効である

あなたは()既存のインデックスのexpireAfterSecondsの値を変更するCREATEINDEXを使用することはできません。代わりに、collMod databaseコマンドをインデックス収集フラグと組み合わせて使用​​します。それ以外の場合は、既存の索引のオプションの値を変更するには、最初に索引を削除してから再作成する必要があります。 groups.google.com/forum/#:個々のドキュメントの有効期限については

https://docs.mongodb.com/v3.4/core/index-ttl/、それが唯一の有効期限を計算し、特定のクロック時間(参照によってそれらの期限切れによって行うことができるという報告があります!トピック/ mongodb-dev/ZLb8KSrLyOo)。

var testItems = [{ 
    "_id": "abc12345", 
    "dmac": "abc", 
    "expireAt": moment().add(3, 'minutes').toDate(), 
    "val": { 
     "0": 10, 
     "1": 15, 
     "2": 5 
    }, 
    "res": "minutes", 
    "time": "2017-12-04T00:12:58Z" 
}]; 
let unix = new moment().valueOf(); 
collection.createIndex({expireAt: unix}, {expireAfterSeconds: 0}, function(error, indexName){ 
    if(error) console.log(error); 
    console.log(indexName); 
}); 
+0

私は値を変更しようとしていません既存のインデックスのexpireAfterSeconds。私はそれらの両方がTTLセットに応じて異なる有効期限に落とされるという機能をテストしようとしています。つまり、mongoDBは300秒より早く私のレコードを削除しています。 – jlyh

+0

同じ「createdAt」キーでcreateIndex()を2回実行 – Shubham

+0

ありがとうございました。私はすでに変更を加えましたが、それを(ユニークな)unixタイムスタンプに変更した後も、同じ(早期期限切れ)動作を示しています。 – jlyh

関連する問題