在定时器+一个条件上删除logging

我的程序是一个在线游戏。 我创build一个包含玩家的游戏对象。 如果没有其他玩家(不是创build游戏的玩家)join游戏,我想在3小时后删除游戏logging。 我可以指望玩家,我知道有关mongodb的TTL,但是我怎样才能设置一个只会触发的TTL,就是没有多个玩家?

使用TTL索引的基本原理是,在logging在索引字段中的时间超过指定秒数后,文档将被删除。 可能不太清楚的是,尽pipe文档示例使用了一个名为“createdAt”的字段,但这并不意味着这是您唯一的限制,因为date字段可以更新。

所以,举个例子,如果你创build一个文档并给它一个“updatedAt”字段,在游戏创build时填充它,然后提供索引定义:

db.games.createIndex({ "updatedAt": 1 },{ "expireAfterSeconds": 10800 }) 

然后,只要新玩家join游戏,或者还有其他一些可以保持游戏“有效”的动作,你所要做的就是“更新”这个值。

 db.games.update( { "_id": gameId }, { "$push": { "players": newPlayer }, "$currentDate": { "updatedAt": true } } ) 

或改变分数:

 db.games.update( { "_id": gameId }, { "$inc": { "score": 20 }, "$currentDate": { "updatedAt": true } } ) 

如果您select使用$currentDate运算符。

因此,TTL索引的“过期date”不是“设置”,只是在检查“当前时间”的过程中工作,并删除TTL索引的索引字段比当前时间“minus”更早的数据指数上设置的到期时间。

总之,创build索引,只是不断更新字段,以保持文件目前。 随着事情的变化,玩家join或离开更新领域。