Как найти по ссылочному документу в Doctrine ODM с MongoDB?

У меня есть один документ в моей коллекции "params":

{
  "_id": ObjectId("4d124cef3ffcf6f410000037"),
  "code": "color",
  "productTypes": [
    {
      "$ref": "productTypes",
      "$id": ObjectId("4d120a2d2b8d8d3010000000"),
      "$db": "test"
    }
  ]
}

ссылочный документ таков:

{
  "_id": ObjectId("4d120a2d2b8d8d3010000000"),
  "code": "car"
}

Я использую DoctrineODM для извлечения "param" документов, на которые ссылается "productType", является "автомобилем". Я использую этот код:

$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);

но результатом является пустой массив. Как я могу это сделать?

Ответы

Ответ 1

Если вы используете ReferenceMany или ReferenceOne, вы не можете запрашивать какое-либо поле ссылочного документа, кроме идентификатора ссылочного документа.

Если вам нужен запрос в code из ссылочной коллекции, вы должны использовать EmbedMany вместо ReferenceMany.

В этом случае ваш документ будет выглядеть следующим образом:

{
  "_id": ObjectId("4d124cef3ffcf6f410000037"),
  "code": "color",
  "productTypes": [
     {
       "_id": ObjectId("4d120a2d2b8d8d3010000000"),
       "code": "car"
     }
  ]
}

И следующий запрос будет работать:

$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);

Также, если ваш код ProductType уникален, вы можете использовать его вместо MongoId, в этом случае вы можете запросить на $id:

{
  "_id": ObjectId("4d124cef3ffcf6f410000037"),
  "code": "color",
  "productTypes": [
    {
      "$ref": "productTypes",
      "$id": 'car',
      "$db": "test"
    }
  ]
}

Ссылка:

{
  "_id": 'car'
}

Query:

$query->field('productTypes.$id')->equals('car');

Ответ 2

Вы должны использовать метод reference() Query Builder для @MongoDB\ReferenceOne, например https://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html

$productType = $dm->getRepository('Cms\Model\ProductTypes')->findOneByCode('car');

$queryBuilder = $dm->getRepository('Cms\Model\Param')->createQueryBuilder()
                   ->field('productTypes')->references($productType);

$results = $queryBuilder->getQuery()->execute();


PS: используйте includeReferenceTo() a @MongoDB\ReferenceMany

Ответ 3

->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i'))