MongoDB / Doctrine ODM / SF4.1: агрегировать как эквивалент внутреннего объединения - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь объединить документы для получения массива со значениями нескольких документов.

Вот моя схема модели:

/**
 * @var string
 *
 * @Mongo\Field(type="string", nullable=false)
 */
protected $name;
/**
 * @var Collection
 *
 * @Mongo\ReferenceMany(targetDocument=Truck::class, inversedBy="circuits")
 */
protected $trucks;
/**
 * @var Stand
 *
 * @Mongo\ReferenceOne(targetDocument=Stand::class, inversedBy="circuits")
 */
protected $stand;

Моя модель грузовика:

/**
 * @var string
 *
 * @Mongo\Field(type="string", nullable=false)
 */
protected $code;
/**
 * @var string
 *
 * @Mongo\Field(type="string", nullable=false)
 */
protected $name;
/**
 * @var Collection
 *
 * @Mongo\ReferenceMany(targetDocument=Circuit::class, inversedBy="trucks")
 */
protected $circuits;

Модель моего стенда:

/**
 * @var string
 *
 * @Mongo\Field(type="string", nullable=false)
 */
protected $name;
/**
 * @var ArrayCollection
 *
 * @Mongo\ReferenceMany(targetDocument=Truck::class, inversedBy="stand", cascade={"persist", "remove"})
 */
protected $trucks;

Моя проблема в том, что я не могу вернуть схему с подставкой и кодом грузовика:

Мой токовый выход выглядит так:

{
"_id" : "5bcdd97724083a098f30bdcc",
"nom" : "First Circuit",
"stand" : {
    "$ref" : "stand",
    "$id" : "5bcdd97424083a098f30bd85",
    "$db" : "my_db"
},
"trucks" : [ 
    {
        "$ref" : "truck",
        "$id" : "5bcdda0324083a099745b22e",
        "$db" : "my_db"
    }
],
"createdAt" : ISODate("2018-10-22T14:06:47.541Z"),
"updatedAt" : ISODate("2018-10-22T14:06:47.541Z")

}

Однако я хотел бы получить такой вывод:

    {
"_id" : "5bcdd97724083a098f30bdcc",
"name" : "First Circuit",
"stand" : {
    "name": "Stand name"
},
"trucks" : [ 
    {
        "code": "Truck code 1"
    },
    {
        "code": "Truck code 2"
    }
],
"createdAt" : ISODate("2018-10-22T14:06:47.541Z"),
"updatedAt" : ISODate("2018-10-22T14:06:47.541Z")

} ​​

В настоящее время я установилпервый запрос к документу схемы, подобный этому:

$queryBuilder = $this->createQueryBuilder()
        ->find()
        ->select(['name', 'trucks'])
        ->field('stand.id')
            ->equals($id)
        ->field('date')
            ->gte($startOfDay)
            ->lte($endOfDay)
        ->hydrate(false)
        ->eagerCursor(true);

Для лучшего понимания я пытаюсь получить эквивалент этого запроса SQL:

SELECT circuit.name, truck.code, stand.name FROM circuit INNER JOIN truck (I do not set the ON clause, because here is a nested document) INNER JOIN stand WHERE date >= '2018-10-22 00:00:00' AND date <= '2018-10-22 23:59:59';

Не могли бы вы помочь мне установитьправильный запрос монго / доктрины, пожалуйста?

Заранее спасибо,

...