¿Cómo encontrar en el documento referenciado en Doctrina ODM con MongoDB?
Pregunta
Tengo un documento en mi colección "params" de esta manera:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"$ref": "productTypes",
"$id": ObjectId("4d120a2d2b8d8d3010000000"),
"$db": "test"
}
]
}
del documento de referencia es la siguiente:
{
"_id": ObjectId("4d120a2d2b8d8d3010000000"),
"code": "car"
}
Estoy usando DoctrineODM a buscar los documentos "param", que hace referencia "ProductType" es "coche". Estoy usando este código:
$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);
pero el resultado es una matriz vacía. ¿Cómo puedo hacer esto?
Solución
Si el uso de ReferenceMany o ReferenceOne no se puede consulta por cualquier campo documento de referencia, excepto Identificación del documento de referencia.
Si necesita consulta en code
de la colección de referencia se debe utilizar en lugar de EmbedMany
ReferenceMany
.
En este caso, el documento será:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"_id": ObjectId("4d120a2d2b8d8d3010000000"),
"code": "car"
}
]
}
Y consulta siguiente funcionará:
$query = $dm->createQuery('Cms\Model\Param');
$query->field('productTypes.code')->equals('car');
$result = $query->execute();
var_dump($result);
Además, si su código es único ProductType se puede utilizar en lugar de MongoId
, en este caso se puede consultar en $ id:
{
"_id": ObjectId("4d124cef3ffcf6f410000037"),
"code": "color",
"productTypes": [
{
"$ref": "productTypes",
"$id": 'car',
"$db": "test"
}
]
}
documento de referencia:
{
"_id": 'car'
}
Consulta:
$query->field('productTypes.$id')->equals('car');
Otros consejos
Debe usar los referencias () Método de generador de consultas para un @MongoDB \ ReferenceOne como 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 : el uso includesReferenceTo () a @MongoDB \ ReferenceMany
->field('productTypes.code')->equals(new \MongoRegex('/.*car.*/i'))