Вот основные структуры 2 документа, которые я использую. Перед запуском программы в mongodb уже есть тысячи родительских документов, но нет дочерних документов:
Код: Выделить всё
ParentDocument:
$id:id
$subDocument:OneToManyReference(ChildDocument)
$etc:everythingelse
ChildDocument:
$id:id
$url:string
$parentDocument:ManyToOneReference(ParentDocument)
Код: Выделить всё
$dm = $this->getContainer()->get('doctrine_mongodb.odm.document_manager');
$parentDocuments = $dm->repository('My:Bundle:ParentDocument')->findAll();
while ($parentDocument = $parentDocuments->getNext()) {
//Returns an array of hundreds of thousands urls
$urls = $this->somehowFetchUrlsRelatedToTheParentDocument($parentDocument);
foreach ($urls as $url) {
$subDocument = new SubDocument();
$subDocument->setUrl($url);
$subDocument->setParentDocument($parentDocument);
$dm->persist($subDocument);
}
$dm->flush();
}
Моя первая попытка решить эту проблему заключалась в очистке документа менеджер документов сразу после его очистки с помощью $dm->clear();
Но это означало, что менеджер документов потеряет текущий родительский документ. Итак, мое решение было таким:
Код: Выделить всё
$dm = $this->getContainer()->get('doctrine_mongodb.odm.document_manager');
$parentDocumentCursors = $dm->repository('My:Bundle:ParentDocument')->findAll();
$parentDocuments = array();
while ($parentDocument = $parentDocumentCursors->getNext()) {
array_push($parentDocuments, $parentDocument);
}
$dm->clear();
unset($dm);
$dm = $this->getContainer()->get('doctrine_mongodb.odm.document_manager');
foreach ($parentDocuments as $parentDocument) {
$urls = $this->somehowFetchUrlsRelatedToTheParentDocument($parentDocument);
foreach ($urls as $url) {
$subDocument = new SubDocument();
$subDocument->setUrl($url);
$subDocument->setParentDocument($parentDocument);
$dm->persist($subDocument);
}
$dm->flush();
$dm->clear();
}
Однако это выглядит как плохая практика и хак быстрого исправления. Как лучше всего вставлять миллионы строк в Symfony2 с помощью диспетчера документов без снижения скорости чтения/записи?
Подробнее здесь: https://stackoverflow.com/questions/135 ... n-symfony2
Мобильная версия