#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, вы должны сделать две вещи:
- Создайте
Date
поле. - Создайте индекс 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 извините, моя ошибка :/ Я быстро печатал и не добавлял параметры для индекса в виде массива, поэтому вместо этого был создан обычный индекс. Смотрите мое редактирование.