Как найти по ссылочному документу в Doctrine ODM с MongoDB? - PullRequest
16 голосов
/ 23 декабря 2010

У меня есть один документ в моей коллекции "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);

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

Ответы [ 3 ]

7 голосов
/ 01 июня 2011

Если вы используете 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');
5 голосов
/ 09 октября 2015

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

0 голосов
/ 20 сентября 2014
->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i'))
...