2016-08-02 48 views
3

Ich habe die folgende Abfrage in MongoDB

$this->createQueryBuilder() 
      ->field('actor')->in($actorIdArray) 
      ->getQuery() 
      ->execute(); 

, wo das Feld Schauspieler mit Annotation ein Objektverweis ist

@MongoDB\ReferenceOne(targetDocument="User", simple=true) 

das heißt, es wird die Objekt-ID speichern, anstelle der vollständigen Referenz.

Wenn $ actorIdArray eine Reihe von ID mit der Form ist

["5706cb39821b166d3931f34f", "56015f7d4f8bd90b769e6e75"] 

die Abfrage nicht nichts zurückgeben, was die erwartet wird, da die eingereichten Schauspieler Objekt-ID enthält.

Allerdings, wenn ich das Array auf diese Weise

[new MongoId("5706cb39821b166d3931f34f"), new MongoId("56015f7d4f8bd90b769e6e75")] 

bauen funktioniert es nicht funktionieren, was für mich sehr überraschend ist.

Das Protokoll zeigt die Abfrage

gemacht wird
{ "actor": {"$in":[{"$id":"5706cb39821b166d3931f34f"},{"$id":"56015f7d4f8bd90b769e6e75"}]}} 

und ich denke, es ist so etwas wie dieses

{ "actor": {"$in":[ObjectId("5706cb39821b166d3931f34f"),ObjectId("56015f7d4f8bd90b769e6e75"]}} 

nicht sicher sein sollten, ob ich tue etwas falsch, irgendwelche Ideen?

+0

es muss ein Array von Dokumenten aus dem ODM sein. – Alsatian

+0

Wenn Sie die Objektladung vermeiden möchten, verwenden Sie eine Referenz http://www.doctrine-project.org/api/mongodb_odm/1.0/class-Doctrine.ODM.MongoDB.DocumentManager.html#_getReference – Alsatian

+0

@Alsatian diese Abfrage funktioniert wenn ich es von der Konsole ausführen { "Schauspieler": { "$ in": [ObjectId ("5706cb39821b166d3931f34f"), ObjectId ("56015f7d4f8bd90b769e6e75"]}} so gibt es keine Notwendigkeit der Verwendung eine Reihe von Dokumenten. – Fran

Antwort

0

Doctrine möchte, dass Ihr Array ein Array von Dokumenten ist.

Sie können document references ohne Abfrage laden.

$dm = $this->get('doctrine.odm.mongodb.document_manager'): 

$documents = array(); 
foreach($actorIdArray as $id){ 
    $documents[] = $dm->getReference('AppBundle:Actor',$id); // <- this is the key 
} 

$this->createQueryBuilder() 
      ->field('actor')->in($documents) 
      ->getQuery() 
      ->execute(); 
+0

Es funktioniert nicht :(das ist, was $ dm-> getReference gibt { "__initializer__": {}, "__cloner__": {}, "__isInitialized__": false } – Fran