MongoDb TTL上嵌套的文档是可能的

本文关键字:文档 MongoDb 嵌套 TTL | 更新日期: 2023-09-27 18:10:44

我想知道是否可以在嵌套文档上使用TTL

<<h3>场景/h3>

Account,里面有SessionsSessions需在30分钟内过期。我已经设置了一切,但很明显,当我在Account.Sessions.EndDateTime上设置TTL索引时,它删除了整个Account。我能确保它只删除Session吗?

这是它在数据库中的样子。注意,当EndDateTime出现时,它将删除整个Account,而不仅仅是Session

{
    "_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)));
}

MongoDb TTL上嵌套的文档是可能的

TTL索引目前无法实现。Mongod将在指定的秒数之后或在特定的时钟时间删除整个文档。

TTL依赖于mongod中读取日期类型的后台线程值,并从集合中删除过期文档

我建议您将会话子文档存储在一个单独的集合中,并在该集合上添加TTL索引。

如果不能更改模式,则可以创建一个后台作业,该作业将每60秒从集合中删除嵌套文档。