Node.js mongoosedb expires属性未过期

Node.js mongoosedb expires属性未过期,node.js,mongodb,mongoose,mongoose-schema,Node.js,Mongodb,Mongoose,Mongoose Schema,我创建了一个包含以下属性的架构: expire: { type: Date, default: Date.now, expires: 60 } 创建新文档时,它会成功地将expire字段设置为当前日期时间 未在集合上创建索引 我随后补充说 model.on('index',function(err){ console.log('index created'); if (err) { console.log(err); } });

我创建了一个包含以下属性的架构:

expire: {
    type: Date,
    default: Date.now,
    expires: 60
}
创建新文档时,它会成功地将expire字段设置为当前日期时间

未在集合上创建索引

我随后补充说

model.on('index',function(err){
    console.log('index created');
    if (err) {
        console.log(err);
    }
});
两个日志都没有发生


所以我假设mongoose甚至没有尝试在集合上创建ttl索引,但我不明白为什么不这样做。我漏了一步吗?我是要自己创建索引吗?mongoose文档似乎暗示mongoose处理索引的创建。

mongoosejs确实按照怀疑的方式处理索引的创建。为了找到问题,我添加了一个EnsureIndex调用,如下所示:

model.ensureIndexes(function (err) {
    console.log('ensure index', err)
})
然后,这表明一个现有索引(唯一电子邮件地址)失败,因为数据库中的现有文档不是唯一的


解决了这个问题,上面的代码就可以正常工作了。希望这能帮助其他遇到mongoose TTL问题的人。

您是如何创建索引的?这就是问题所在。我应该自己做吗?mongoose文档声明索引是在您使用expires属性时创建的,因此我自己没有尝试创建索引。检查索引是否已在db中创建-在MongoShell
db.yourdb.getIndexes()中运行此操作
更改索引时,您必须在新索引生效之前在集合中手动删除它。谢谢,但我在问题中指出,尚未创建索引。