Контекст:
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