Есть ли более умный способ получить идентификационный номер документа, на который ссылаются, не запрашивая его и не гидратируя его?

У меня есть документ, который содержит ссылки на некоторые другие документы. Как и большинство людей, я использую 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();
Другие вопросы по тегам