16

我的“参数”集合中有一个文档,如下所示:

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

参考文件是这样的:

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

我正在使用 DoctrineODM 来获取引用“productType”为“car”的“param”文档。我正在使用这段代码:

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

但结果是一个空数组。我怎样才能做到这一点?

4

3 回答 3

7

如果您使用 ReferenceMany 或 ReferenceOne,则不能通过任何参考文档字段进行查询,参考文档 ID 除外。

如果您需要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');
于 2011-06-01T07:01:39.503 回答
7

您必须对@MongoDB\ReferenceOne使用Query Builder的references()方法,例如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()一个@MongoDB\ReferenceMany

于 2015-10-09T13:29:34.750 回答
0
->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i'))
于 2014-09-19T20:45:57.030 回答