Поиск дубликатов документов и их удаление

Иногда появляется необходимость в обширных каталогах найти одинаковые документы. При условии что вложенность большая и pagetitle документов не обязательно уникальны.

Моей задачей было удалять старые документы с идентичными ключевыми словами

Источник проблемы:
Сайт с огромным каталогом, импорт объектов из внешнего файла.
Импорт автоматизирован и повешен на крон. При импорте запрашиваются координаты объекта у яндекса, в следствии чего скрипты зависают, а объекты могут продублироваться.

Вот такой код, при необходимости повешенный на крон, успешно и без особых нагрузок корректно удаляет дублирующие документы c идентичными заголовками и ключевыми словами


<?php
	@ini_set("display_errors","1");
	error_reporting(E_ALL);	

	define('MODX_API_MODE', true);
	include_once(dirname(__FILE__)."/index.php");
	$modx->db->connect();
	if (empty ($modx->config)) {
		$modx->getSettings();
	}

	require_once($basePath.'assets/libs/resourse.php');
	$resourse=resourse::Instance($modx);

	$rsQuery = 'SELECT COUNT(c.id) AS cnt, c.pagetitle, t.value FROM '.$modx->getFullTableName('site_content').' c ';
	$rsQuery.= 'INNER JOIN '.$modx->getFullTableName('site_tmplvar_contentvalues').' t ON t.contentid = c.id AND t.tmplvarid = 3 '; // JOIN уникального ТВ параметра
	$rsQuery.= 'GROUP BY c.pagetitle, t.value HAVING COUNT(c.id) > 1 ORDER BY c.pagetitle';
	$res = $modx->db->query($rsQuery);
	
	if ($res && mysql_num_rows($res) > 0){
		while($i = mysql_fetch_assoc($res)){
			echo("<p>{$i['cnt']} - {$i['pagetitle']} - {$i['value']}</p>");
			$cnt = $i['cnt'] - 1;
			$sres = $modx->db->query("SELECT contentid FROM ".$modx->getFullTableName('site_tmplvar_contentvalues')." WHERE value = '{$i['value']}' ORDER BY contentid ASC LIMIT $cnt");
			if ($sres && mysql_num_rows($sres) > 0){
				while($z = mysql_fetch_assoc($sres)){
					echo("<p>Must-delete = {$z['contentid']}</p>");
					$resourse->delete($z['contentid']);
				}
			}
		}
	}
		
?>


*Код легко расширяется на учёт нескольких ТВ параметров.

Возможно кому-то данный пример будет полезен при решении его задач.

2 комментария

avatar
А почему вместо заброшенного resourse не используете MODxAPI? В плане синтаксиса не сильно отличается.
avatar
Не было опыта работы с MODxAPI
Сейчас почитаю, и может перепишу решение на основе него.
Спасибо за совет
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.