Срок действия документов истекает в определенное время в mongodb с php

#php #mongodb

#php #mongodb

Вопрос:

У меня есть этот код внутри моего php:

     $m = new MongoClient();
    $db = $m->selectDB('authentication');
    $collection = new MongoCollection($db, 'digits');
    $document = array( 
        "username" => $_POST['username'], 
        "digits" => $_POST['digits']
        );
    $collection->insert($document);
 

Я хочу, чтобы эти документы были удалены через 2 часа автоматически с использованием функции ttl mongodb.
каждую минуту могут вставляться тысячи документов, поэтому я не хочу, чтобы они становились грязными или глючными, я хочу, чтобы они удалялись независимо в одной и той же коллекции.
Если вы можете поместить код на php, я был бы признателен. потому что везде они просто объясняли команды mongodb напрямую, что я не мог понять, как использовать его в php. спасибо.

Редактировать 1: с помощью «Christian P» я создал 30 документов для тестирования:

     for($i=0;$i<30;$i  ){
        $m = new MongoClient();
        $db = $m->selectDB('authentication');
        $collection = new MongoCollection($db, 'teeeest');
        $collection->ensureIndex(array('createdAt' => 1, 'expireAfterSeconds' => 60));
        $document = array( 
                    "username" => "4563678678", 
                    "digits" => "5958974",
                    "createdAt" => new MongoDate()
                    );
        $collection->insert($document);

        sleep(1);
    }
 

но они не удаляются.
пример созданных документов:

 {
    "_id": {
        "$oid": "53ac7c237fae31100e000109"
    },
    "username": "4563678678",
    "digits": "5958974",
    "createdAt": {
        "$date": "2014-06-26T20:01:39.000Z"
    }
}

{
    "_id": {
        "$oid": "53ac7c247fae31100e00010a"
    },
    "username": "4563678678",
    "digits": "5958974",
    "createdAt": {
        "$date": "2014-06-26T20:01:40.000Z"
    }
}

{
    "_id": {
        "$oid": "53ac7c257fae31100e00010b"
    },
    "username": "4563678678",
    "digits": "5958974",
    "createdAt": {
        "$date": "2014-06-26T20:01:41.000Z"
    }
}
 

Редактировать 2:
как сказал «Christian P» в своей правке, «expireAfterSeconds» следует передавать в виде массива.

Комментарии:

1. mattgemmell.com/what-have-you-tried

2. @ThomasRuiz: нет, я не имею в виду весь код. Я имел в виду, как и я, от $ m = new MongoClient(); до $collection-> insert ($document); это будет не более 10 строк.

Ответ №1:

Чтобы автоматически истекал срок действия данных из коллекции, установив TTL, вы должны сделать две вещи:

  1. Создайте Date поле.
  2. Создайте индекс TTL для этого поля.

Для создания поля даты в PHP вам необходимо использовать объект MongoDate:

 $document = [ 
    "username" => $_POST['username'], 
    "digits" => $_POST['digits'],
    "createdAt" => new MongoDate()
];
 

Вы можете добавить индекс TTL, используя команду ensureIndex, как и другие обычные индексы.

 $collection->ensureIndex(
    ['createdAt' => 1], ['expireAfterSeconds' => 7200]
);
 

Приведенная выше команда добавит индекс индекса TTL createdAt , который удалит документы через 2 часа.

Комментарии:

1. Я не знал о MongoDate(), спасибо. и я понял, что часовой пояс mongodb равен -1 UTC, а время сервера -8 UTC. Я изменил часовой пояс Windows server на -1UTC, а для теста я изменил ttl на 20 секунд и повторил попытку. теперь они вставляются в нужное время, но по-прежнему ничего не происходит. ни один из них не был удален даже спустя более пяти минут.

2. @MDP извините, моя ошибка :/ Я быстро печатал и не добавлял параметры для индекса в виде массива, поэтому вместо этого был создан обычный индекс. Смотрите мое редактирование.