Doctrine MongoDB ODM: Как получить конкретный PHP-документ из документа? - PullRequest
0 голосов
/ 27 августа 2018

Контекст: MongoDB 4 и Symfony 4 с доктриной ODM

Пример документа:

{
  id: "pikachu",
  name: "Pikachu,
  attacks: [
    {
      name: "Charge",
      power: 40,
    },
    {
      name: "Thunder",
      power: 80,
    }
  ]
}...

Как я могу получить объект App \ Document \ Pokemon \ Attack, где name = "Thunder"?

1)

Сделайте цикл в PHP и найдите его

Но:

  • это может стать рекурсивным поиском, если в документ встроен

2)

Выполните агрегацию с помощью построителя запросов и получите результат в виде массива PHP:

$dm->createAggreationBuilder(Pokemon::class)
    ->unwind('$attacks')
    ->match()->field('attacks.name')->equals('Thunder')
    ->project()->excludeField(['_id'])
    ->field('name')->expression('$attacks.name')
    ->field('power')->expression('$attacks.power')
    ->execute()->getSingleResult();

Но:

  • запрос выполняется поле за полем, чтобы иметь правильную структуру
  • Мне нужно десериализовать его, чтобы получить документ PHP

Вопросы:

1) или 2) способ сделать это? Если нет, то как правильно делать эту работу, используя Doctrine? Или избегать доктрины: D?

Конечно, мой пример прост, но решение должно сделать работу с большим документом с большей глубиной.

Или я должен сделать другую коллекцию (Атака) и использовать ссылки?

TY

...