2017-11-01 17 views
0

PHPでMongoDB ODM照会ビルダーを使用して、一致する組み込み文書のみを返す際に問題があります。埋め込まれた各ドキュメントには、作成時に生成されたMongoIDがあります。続いて、コレクションの私の文書構造プロジェクトです:Doctrine MongoDB ODM - 照会ビルダーを使用して一致した組み込み文書のみを返します。

{ 
    "_id" : ObjectId("59f889e46803fa3713454b5d"), 
    "projectName" : "usecase-updated", 
    "classes" : [ 
     { 
      "_id" : ObjectId("59f9d7776803faea30b895dd"), 
      "className" : "OLA" 
     }, 
     { 
      "_id" : ObjectId("59f9d8ad6803fa4012b895df"), 
      "className" : "HELP" 
     }, 
     { 
      "_id" : ObjectId("59f9d9086803fa4112b895de"), 
      "className" : "DOC" 
     }, 
     { 
      "_id" : ObjectId("59f9d9186803fa4212b895de"), 
      "className" : "INVOC" 
     } 
    ] 
} 

今私は、データベースからと私の基準を満たしているクラス埋め込まれた文書からのみクラス(すなわちクラスを取得したいです特定のID) .Thisは、私は、クエリを構築しています方法です:

$qb = $dm->createQueryBuilder('Documents\Project'); 
$projectObj = $qb 
    ->field('id')->equals("59f889e46803fa3713454b5d") 
    ->field('classes')->elemMatch(
     $qb->expr()->field("id")->equals(new \MongoId("59f9d7776803faea30b895dd")) 
    ) 
    ->hydrate(false) 
    ->getQuery() 
    ->getSingleResult(); 

まず私はウィットに一致しますhプロジェクトID、次に埋め込みドキュメントクラスIDと一致します。私はそれがこのようOLAの唯一の埋め込まれた文書を返すように期待していた。

{ 
    "_id" : ObjectId("59f889e46803fa3713454b5d"), 
    "projectName" : "usecase-updated", 
    "classes" : [ 
      { 
      "_id" : ObjectId("59f9d7776803faea30b895dd"), 
      "className" : "OLA" 
      } 
    ] 
} 

をしかし、教義は.Iも集計クエリの建物で試してみました(質問の先頭に示されている)全体プロジェクトレコードを返します$match凝集にまだ結果が同じで、次のように私は集約ビルダーで作成したクエリは次のとおりです。

$qb = $dm->createAggregationBuilder('Documents\Project'); 
    $projectObj = $qb 
     ->match() 
     ->field('id')->equals($projectId) 
     ->field('classes._id')->equals(new \MongoId($classId)) 
     ->execute() 
     ->getSingleResult(); 

は、誰かがこの問題に関して私を助けることができますか?どのように私は私が上記のように望ましい結果を得るクエリを構築することができます。

+1

ODMはドキュメント全体で機能します。アプリケーションでフィルタリングするか、[aggregation](http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/aggregation-builder.html)を使用してください。 –

+0

@AlexBlex私もそれを試しましたが、それでも結果は同じでした。集計クエリビルダで質問を更新しました – Seeker

+1

'find'とまったく同じ1つの' match'ステージを使用しています。ドキュメントの形状を変更するには、少なくとも[プロジェクト](https://docs.mongodb.com/manual/reference/operator/aggregation/project/#pipe._S_project)の段階が必要です。そこにある[配列関数](https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#array-expressions)を見てください。 –

答えて

0

だから私はいくつかのトラブルの後、私はアグリゲーションビルダで一致した埋め込みドキュメントだけを取得することができます。私は、最初のクエリでそう

$qb = $dm->createAggregationBuilder('Documents\Project'); 
    $classObject = $qb->match() 
     ->field("id", new \MongoId($projectId)) 
     ->project() 
     ->field("classes") 
     ->filter('$classes', 'class', $qb->expr()->eq('$$class._id', new \MongoId($classId))) 
     ->execute()->getSingleResult(); 

Alex Bles @コメント私は、集計関数を使用して、より考えることができたと私は$filter配列アグリゲーション機能を発見し、それを使用してクエリを構築し、最終的なクエリは、このようなものだった試みたのおかげでそうプロジェクトの_idと一致しています。そのプロジェクト内で$filter配列集計メソッドを使用してclassesの結果を予測しました。最終的には、埋め込まれたドキュメントを_idでフィルタリングすることができました。これは、同じ問題を抱えて将来誰かを助けてくれることを願っています。

関連する問題