MongoDB TTL на вложенном документе возможен?

Я хочу знать, можно ли использовать 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)));
}

1 ответов


в настоящее время это невозможно с индексом TTL. Mongod удалит весь документ через определенное количество секунд или в определенное время.

TTL полагается на фоновый поток в mongod, который считывает типизированную дату значения в индексе и удаляет истекшие документы из коллекции.

Я бы рекомендовал сохранить вложенный документ сеанса в отдельной коллекции и добавить индекс TTL на этом коллекция.

Если вы не можете изменить схему, альтернативой является создание фонового задания, которое будет удалять вложенные документы из вашей коллекции каждые 60 секунд.