嵌套文档上的MongoDb TTL是否可行?

 森南有鹿63N 发布于 2023-01-07 11:09

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

脚本

我有Account,我在里面Sessions.Sessions需要在30分钟后到期.我已经设置了所有内容但显然当我设置TTL索引时Account.Sessions.EndDateTime它会删除整个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)));
}

Christian P.. 5

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

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

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

如果您无法更改架构,则替代方法是创建一个后台作业,每60秒从您的集合中删除嵌套文档。

1 个回答
  • 目前无法使用TTL索引。Mongod将在指定的秒数或特定的时钟时间后删除整个文档。

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

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

    如果您无法更改架构,则替代方法是创建一个后台作业,每60秒从您的集合中删除嵌套文档。

    2023-01-07 11:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有