Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是时候住在mongodb了,Mongose不工作了。文档不会被删除_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 是时候住在mongodb了,Mongose不工作了。文档不会被删除

Node.js 是时候住在mongodb了,Mongose不工作了。文档不会被删除,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我在node.js应用程序中使用此方案进行会话 var mongoose = require('mongoose'); var Schema = mongoose.Schema; // define the schema for our user session model var UserSessionSchema = new Schema({ sessionActivity: { type: Date, expires: '15s' }, // Expi

我在node.js应用程序中使用此方案进行会话

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;
// define the schema for our user session model
var UserSessionSchema   = new Schema({
    sessionActivity:    { type: Date, expires: '15s' }, // Expire after 15 s
    user_token:         { type: String, required: true }
});
module.exports = mongoose.model('UserSession', UserSessionSchema);
我在我的应用程序中创建一个“会话”:

...
var session = new Session();
session.user_token = profile.token;
session.save(function(save_err) {
    if (save_err) {
        ....
    } else {
        // store session id in profile
        profile.session_key = session._id;
        profile.save(function(save_err, profile) {
            if (save_err) {
                ...
            } else {
                res.json({ status: 'OK', session_id: profile.session_id });
            }
});
...
问题是文档永久存在,它永远不会过期。它只能存活15秒(最多一分钟)。我的代码怎么了?我尝试将expries:string设置为数字,即15,设置为字符串“15s”,以此类推

var UserSessionSchema   = new Schema({
    sessionActivity:    { type: Date, expires: '15s', default: Date.now }, // Expire after 15 s
    user_token:         { type: String, required: true }
});
TTL索引在文档的值(应该是日期或日期数组)经过“x”秒后删除文档。TTL每分钟检查一次,因此它的寿命可能比您给定的15秒稍长

要为日期指定默认值,可以使用Mongoose中的
default
选项。它接受一个函数。在本例中,
Date()
返回当前时间戳。这会将日期设置为当前时间一次

你也可以走这条路线:

UserSessionSchema.pre("save", function(next) { 
    this.sessionActivity = new Date(); 
    next(); 
});

这将在每次调用
.save()
(但不是
.update()
)时更新该值。

要仔细检查在数据库中创建的索引,可以在mongo shell
DB.yourdb.getIndexes()
中运行此命令。更改索引时,必须在新索引生效之前在集合中手动删除它。检查此处以了解更多信息

TTL索引的可能重复需要一个整数,持续数秒直到到期,而不是字符串。该过程也每分钟运行一次。所以这可能需要一分钟的到期时间。我尝试过用一个数字设置expires属性。我读过这个问题,Christian,但我真的没有注意到:“创建文档时,由您将createdAt设置为当前时间。”我是否需要将createdAt设置为最新。now()或类似的内容?谢谢,但我不能这样做,文档会在很长一段时间后删除,但不会在15秒(或大约一分钟)内删除。如果我运行ISODate()来获取shell中的本地时间,我会得到“ISODate”(“2014-06-03T09:55:35.473Z”),但文档仍然存在。如果我查看文档,我可以看到“sessionActivity”的值为ISODate(“2014-06-03T09:49:57.977Z”)。它应该在几分钟前被删除。mongo shell中的
db.usersessions.getIndexes()
的输出是什么?(您可能需要更正集合名称)。应该有一个类似于
{“key”:{“sessionActivity”:1}“expireAfterSeconds”:}
>db.usersessions.getIndexes()[{“v”:1,“key”:{“id”:1},“name”:“\u id”,“ns”:“aquamoto.usersessions”},{“v”:1,“key”:{“sessionActivity”:1},“name”:“sessionActivity_1”,“ns”:“aquamoto.usersessions”,“expireAfterSeconds”:15,“background”:true}]>现在它可以工作了!{type:Date,expires:'15s',默认值:Date}不起作用,但是UserSessionSchema.pre(“保存”,函数(下一个){this.sessionActivity=new Date();next();});使用{type:Date,expires:15}工作!!!不知道为什么但它工作:)事实上,我没有。值
Date.now
是一个函数,这意味着Mongoose将在每次需要默认值时运行该函数。如果要添加括号(
default:Date.now()}
),那么该值将被计算一次,并且始终是相同的日期(更具体地说:开始脚本的时间)。