gpt4 book ai didi

php - Doctrine MongoDB ODM - 使用查询生成器仅返回匹配的嵌入文档

转载 作者:行者123 更新时间:2023-12-03 02:15:15 28 4
gpt4 key购买 nike

我在使用 PHP 中的 MongoDB ODM 查询生成器仅返回匹配的嵌入文档时遇到问题。每个嵌入文档都有一个在创建时生成的 MongoID。以下是我的集合项目的文档结构:

{ 
"_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)。这就是我构建查询的方式:

$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();

首先我与项目 ID 匹配,然后与嵌入文档类 ID 匹配。我期望它只返回 OLA 的嵌入文档,如下所示:

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

但 Doctrine 正在返回整个项目记录(显示在问题的开头)。我还尝试使用 $match 构建聚合查询聚合结果仍然相同,我使用聚合生成器创建的查询如下:

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

有人可以帮我解决这个问题吗?我如何构建查询才能获得如上所述的所需结果。

最佳答案

因此,经过一些麻烦后,我只能使用聚合生成器检索匹配的嵌入文档。感谢@Alex Bles评论我能够更多地思考使用聚合函数,我发现$filter数组聚合函数并尝试使用它构建查询,最终查询如下:

    $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();

因此,在查询中,我首先与项目的 _id 进行匹配。然后在该项目中,我使用 $filter 投影了的结果数组聚合方法。最后,我能够通过 _id 过滤嵌入文档。希望这对将来遇到同样问题的人有所帮助。

关于php - Doctrine MongoDB ODM - 使用查询生成器仅返回匹配的嵌入文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47059462/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com