2010-12-22 23 views
14

tengo un documento en mi colección "params" de esta manera:¿Cómo encontrar por documento referenciado en Doctrine ODM con MongoDB?

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

el documento de referencia es la siguiente:

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

estoy usando DoctrineODM a buscar los documentos "param", que hace referencia " productType "is" car ". 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?

+0

Qué base de datos está conectando? No es 'prueba' o 'administrador' ¿no? –

+0

no. no es prueba o administrador. Cambié el nombre. – cnkt

+0

¿Podemos ver sus clases de documentos? –

Respuesta

6

Si utiliza ReferenceMany o ReferenceOne no puede consultar por ningún campo de documento de referencia, excepto el documento de identidad de referencia.

Si necesita consulta en code de la colección a la que se hace referencia, debe usar EmbedMany en lugar de 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); 

También si su código ProductType es único que puede utilizar en lugar de MongoId, en este caso Puede consultar en $ id:

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

Documento referenciado:

{ 
    "_id": 'car' 
} 

Consulta:

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

Esto no aborda la pregunta. No puede usar Embed * para todo: la referencia * está ahí por algún motivo. El verdadero problema que veo es que tiene que echar un vistazo a la base de datos real por su cuenta para darse cuenta de que las referencias se asignan como $ varname.id. Para que pueda consultar: ...-> findBy (array ('referenceField.id' => managedDoc-> getId()) Todavía no es una buena solución porque a uno no le debe importar ni siquiera saber de qué manera interna Doctrine lo hace Referencia * asociaciones ... –

+5

En realidad, lo tomo de vuelta, parcialmente.DocumentPersister-> prepareQueryValue() en Doctrine \ ODM \ MongoDB \ Persisters en DoctrineODM parece hacer la magia! Convierte 'referenceVar.idField' en las consultas de find * para que, independientemente de la implementación subyacente de Reference *, funcione. Es decir. parece que findOneBy ('referencedDoc.id' -> ... some_id ...) es el uso previsto ... Estoy continuamente sorprendido de cuánto trabajo se ha dedicado a crear Doctrine ODM para Mongo. ¡Es tan grande y tan bien pensado! –

+1

@JakubP. ¿Qué hay de agregar estos comentarios como una respuesta? –

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

Debe utilizar los referencias() método de generador de consultas para una @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: utilizar includesReferenceTo() un @MongoDB \ ReferenceMany

Cuestiones relacionadas