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();
は、誰かがこの問題に関して私を助けることができますか?どのように私は私が上記のように望ましい結果を得るクエリを構築することができます。
ODMはドキュメント全体で機能します。アプリケーションでフィルタリングするか、[aggregation](http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/aggregation-builder.html)を使用してください。 –
@AlexBlex私もそれを試しましたが、それでも結果は同じでした。集計クエリビルダで質問を更新しました – Seeker
'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)を見てください。 –