Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 删除计时器上的记录+;一个条件_Node.js_Mongodb_Express_Sails.js_Database - Fatal编程技术网

Node.js 删除计时器上的记录+;一个条件

Node.js 删除计时器上的记录+;一个条件,node.js,mongodb,express,sails.js,database,Node.js,Mongodb,Express,Sails.js,Database,我的程序是一个在线游戏。我创建了一个包含玩家的游戏对象。如果没有其他玩家(创建游戏的玩家除外)加入游戏,我想在3小时后删除游戏记录。 我可以计算玩家数量,我知道mongodb TTL,但是如果没有多个玩家,我如何设置只会触发的TTL?使用TTL索引的基础是,在索引字段中记录的时间超过指定秒数后,文档将被删除。可能不太明显的是,尽管使用名为“createdAt”的字段,但这并不意味着这是您的唯一限制,因为日期字段可以更新 因此,例如,如果您创建一个文档,并给它一个“updatedAt”字段,在创建

我的程序是一个在线游戏。我创建了一个包含玩家的游戏对象。如果没有其他玩家(创建游戏的玩家除外)加入游戏,我想在3小时后删除游戏记录。
我可以计算玩家数量,我知道mongodb TTL,但是如果没有多个玩家,我如何设置只会触发的TTL?

使用TTL索引的基础是,在索引字段中记录的时间超过指定秒数后,文档将被删除。可能不太明显的是,尽管使用名为“createdAt”的字段,但这并不意味着这是您的唯一限制,因为日期字段可以更新

因此,例如,如果您创建一个文档,并给它一个“updatedAt”字段,在创建游戏时填充该字段,然后提供索引定义:

db.games.createIndex({“updatedAt”:1},{“expireAfterSeconds”:10800})
然后,您真正需要做的就是在新玩家加入游戏时“更新”该值,或者有其他动作保持游戏“有效”:

db.games.update(
{u id:gameId},
{
“$push”:{“玩家”:新玩家},
“$currentDate”:{“updatedAt”:true}
}
)
或更改分数:

db.games.update(
{u id:gameId},
{
“$inc”:{“分数”:20},
“$currentDate”:{“updatedAt”:true}
}
)
如果选择,也可以使用运算符

因此,TTL索引的“过期日期”不是“设置”的,它只是在一个进程上工作,该进程检查“当前时间”,并删除TTL索引的索引字段早于当前时间“减去”索引上设置的过期秒数的任何数据


简而言之,创建索引并不断更新字段以保持文档的最新状态。随着情况的变化,玩家的加入或离开会更新该字段。

如果我错了,请纠正我,但在第二个玩家加入10800秒后,这仍然会删除记录?如果其他玩家加入,我不想删除任何内容。目标是清理我的数据库,它有一些其他ppl从未有过的游戏joined@dkx22我说的“关键”是你“不断”更新时间戳,在游戏中的每一个动作。这就是它保持“新鲜”的原因,只有在“运行中”时才会发生更新。你现在明白我的意图了吗?明白了,我在这里学到了一些东西。但是现在让我们假设我使用这个,两个玩家已经完成了一场游戏。因此,该游戏将不再更新,因此将被删除。我怎样才能防止这种情况?我想我可以把完成的游戏换成另一个模式,但我宁愿把它们放在里面game@dkx22. 假设有两个玩家只是坐在那里无所事事,甚至说他们去了AFK,忘了注销?你会让比赛永远坐在那里吗?或者你会在某个阶段清理它?在一天结束时,如果您愿意,您可以使用自己的逻辑编写自己的计时器进程。但是问问你自己,你真的从努力中得到了什么吗?永远保持不活跃的游戏对你来说真的重要吗?为什么要让它们过期呢?。这些是真正的问题,只有你才能真正回答。我只是想知道你能做什么,而不需要再编写另一个代码process@dkx22换句话说,“不,一个TTL索引不能有其他条件”,所以如果你能在限制条件下工作,那么就使用它。如果没有,请编写自己的流程来进行清理。