Doctrine MongoDB ODM — возвращает только сопоставленный внедренный документ с помощью построителя запросов

У меня проблемы с возвратом только соответствующего внедренного документа, используя конструктор запросов MongoDB ODM в PHP. Каждый встроенный документ имеет идентификатор 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"}
]
}

Теперь я хочу получить из базы данных только учебный класс от классы встроенные документы, которые соответствуют моим критериям (Т.е. учебный класс с конкретным идентификатором).Вот как я строю запрос:

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

Сначала я сопоставляю с идентификатором проекта, затем сопоставляю со встроенным идентификатором класса документа. Я ожидал, что он вернет только вложенный документ OLA как это:

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

Но учение возвращает все проект запись (показано в начале вопроса). Я также попытался с агрегацией построения запроса с $ матч Агрегация по-прежнему приводит к тому же результату. Запрос, который я создал с помощью Агрегации, выглядит следующим образом:

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

Может ли кто-нибудь помочь мне с этим вопросом? Как я могу построить запрос, чтобы получить желаемый результат, как указано выше.

0

Решение

Поэтому после некоторой проблемы я могу получить только соответствующий вложенный документ с помощью построителя агрегации. Так что благодаря @Алекс Блес комментарий я смог больше думать об использовании функций агрегации, и я нашел $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 проекта. Затем в рамках этого проекта я спроектировал результаты для classes с использованием $filter метод агрегации массивов. В итоге я смог отфильтровать вложенный документ по их _id, Надеюсь, что это поможет кому-то в будущем с той же проблемой.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector