Есть ли более умный способ получить идентификационный номер документа, на который ссылаются, не запрашивая его и не гидратируя его?
У меня есть документ, который содержит ссылки на некоторые другие документы. Как и большинство людей, я использую MongoId в поле "id" в URL для просмотра этих документов. Ситуация такова, что я хочу отображать ссылки на эти ссылочные документы из основного документа. Чтобы получить идентификатор ссылочного документа, я использую код, подобный следующему:
$mainDocument->getReferencedDoc()->getId();
Очевидным раздражением здесь является то, что доктрина выполнит еще один запрос для извлечения документа, на который ссылаются, просто чтобы я мог получить идентификатор. Но технически идентификатор уже существует в основном документе в поле ссылки. Не должен ли быть более эффективный способ получить только идентификатор без необходимости запрашивать и обрабатывать весь документ, на который есть ссылки? Нужно ли мне писать собственные запросы каждый раз, когда я хочу это сделать?
Проблема становится существенной, когда вы генерируете большой список основных документов, содержащих ссылки на документы, на которые они ссылаются.
3 ответа
Похоже, что он ведет себя так с момента коммита 6 февраля. Таким образом, эта проблема решена с помощью последней версии mongodb-odm.
Самый простой способ сделать это - добавить второе свойство в ваш класс Document.
/**
* @ReferenceOne(targetDocument="SomeOtherDocument", simple=true)
*/
protected $referencedDoc;
/**
* @Field(name="referencedDoc", type="string")
*/
protected $referencedDocId;
Теперь вы можете просто сделать $document->getReferencedDocId();
, Я не совсем уверен, что это возможно из-за type=string. Я использую это с ORM, но еще не использовал его с ODM.
Если кому-то нужен правильный способ получения идентификатора ссылочного документа MongoDB без (!) Его ленивой загрузки, вот оно:
/** @var $metaData \Doctrine\ODM\MongoDB\Mapping\ClassMetadata */
$metaData = $this->documentManager->getClassMetadata('SomeReferencedDocument');
$metaData->getIdentifierValue($object->getSomeReferencedDocument())
Вместо (который все еще лениво загружает ссылочный документ, используя новейший DoctrineODMBundle):
$object->getSomeReferencedDocument()->getId();