Как найти по ссылкам документ в доктрине 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('CmsModelParam');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);

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

3 ответов


если вы используете 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->field('productTypes.$id')->equals('car');

вы должны использовать ссылки() метод построителя запросов для @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 используйте includesReferenceTo() a @MongoDB\ReferenceMany


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