我想知道是否可以在嵌套文档上使用TTL。
我有Account
,内有Sessions
。 Sessions
需要在30分钟后过期。我设置了所有内容,但很明显,当我在Account.Sessions.EndDateTime
上设置TTL索引时,它会移除整个Account
。我可以确保它只删除Session
吗?
这就是它在数据库中的样子。请注意,当Account
到来时,它将如何删除整个Session
而不仅仅EndDateTime
。
{
"_id" : ObjectId("53af273888dba003f429540b"),
"Email" : "steve@s3te5ve.com",
"PasswordHash" : "CZaBEQRbwWNgJBjyhks7gH0Z3v5ZvDkW29pryF0DEXyE8rIw0NA4x39+uQneArKaUv97sP1e+e22YT1glbqQsw==",
"PasswordSalt" : "100000.Qx4D8uj7oDcWHRTLGRRTDwVkw2UcaM52XkDR9k2ga073Ow==",
"Sessions" : [
{
"Token" : "da55cf0783c4249b26283948fcae6caa15df320ca456203045aea81cad691df8",
"IpAddress" : "::1",
"StartDateTime" : ISODate("2014-06-28T20:36:27.000Z"),
"EndDateTime" : ISODate("2014-06-28T21:06:27.000Z")
}
]
}
这是我创建所述索引的地方。
if (!_db.Accounts.IndexExists("Sessions.EndDateTime"))
{
_db.Accounts.CreateIndex(IndexKeys.Ascending("Sessions.EndDateTime"),
IndexOptions.SetTimeToLive(new TimeSpan(0)));
}
答案 0 :(得分:5)
TTL索引目前无法实现。 Mongod将在指定的秒数或特定时钟时间后删除整个文档。
TTL依赖mongod中的后台线程来读取日期类型 索引中的值,并从集合中删除过期的文档。
我建议您将会话子文档存储在单独的集合中,并在该集合上添加TTL索引。
如果您无法更改架构,则可以选择创建一个后台作业,该作业将每隔60秒从您的集合中删除嵌套文档。