我的程序是一款在线游戏。我创建了一个包含玩家的游戏对象。如果没有其他玩家(比创建游戏的玩家)加入游戏,我想在3小时后移除游戏记录。 我可以算上玩家,而且我知道mongodb TTL但我怎么能设置一个只会触发没有多个玩家的TTL?
答案 0 :(得分:1)
使用TTL索引的基础是文档将在指定的秒数从索引字段中记录的时间过去后删除。可能不太明显的是,虽然documentation examples使用名为“createdAt”的字段,但这并不意味着这是您唯一的限制,因为日期字段可以更新。
例如,如果你创建一个文档并给它一个“updatedAt”字段,你在创建游戏时填充,然后提供索引定义:
db.games.createIndex({ "updatedAt": 1 },{ "expireAfterSeconds": 10800 })
然后你真正需要做的就是每当新玩家加入游戏时“更新”该值,或者还有一些其他动作让游戏“有效”:
db.games.update(
{ "_id": gameId },
{
"$push": { "players": newPlayer },
"$currentDate": { "updatedAt": true }
}
)
或改变分数:
db.games.update(
{ "_id": gameId },
{
"$inc": { "score": 20 },
"$currentDate": { "updatedAt": true }
}
)
如果您选择,也使用$currentDate
运算符。
因此TTL索引的“过期日期”不是“设置”,它只适用于检查“当前时间”的进程,并删除TTL索引的索引字段早于当前时间的任何数据“减去”索引上设置的到期秒数。
简而言之,创建索引并继续更新字段以使文档保持最新。随着事情的变化,玩家加入或离开更新领域。