Doctrine ODM: оператор add не принимает объект в качестве операнда

Я пытаюсь использовать Doctrine ODM для взаимодействия с моей базой данных Монго, и я пытаюсь использовать этот запрос Монго, который без проблем выполняется в CLI MongoDB:

db.products.aggregate(
[
    {
        $match:  {highEndEmployees: {$lt: 2001 }, lowEndEmployees: {$gt: 1400} }
    },
    {
        $project: { 
            lowEndFinalPrice: {
                $add: [
                        { $multiply: ["$priceMultiplierUser", "$lowEndUsers"] },
                        { $multiply: ["$priceMultiplierEmployee", "$lowEndEmployees"] },
                        { $multiply: ["$priceMultiplierJobOpenings", "$lowEndJobOpenings"] },
                        "$priceBase"
                    ]
            },
            pricePerUser: {$multiply: ["$priceMultiplierUser", "$lowEndUsers"]}, 
            pricePerEmployee: {$multiply: ["$priceMultiplierEmployee", "$lowEndEmployees"]},
            pricePerJobOpening: {$multiply: ["$priceMultiplierJobOpenings", "$lowEndJobOpenings"]},
        }
    },
    {
        $sort: { lowEndFinalPrice: 1 }
    }
]);

В Doctrine ODM этот запрос будет выглядеть так:

    array(
          "aggregate" => "products",
          "pipeline" => array(
              array('$match' =>
                  array(
                    "highEndEmployees" => array('$lt' => 2001),
                    "lowEndEmployees" =>  array('$gt'=> 1400)
                  )
              ),
              array('$project' => array(
                  'lowEndFinalPrice' => array(
                      '$add' => '$priceBase',
                      '$add' => array(
                          '$multiply' => array('$priceMultiplierUser', '$lowEndUsers')
                      )
                  )
              ))
          )
        )
    );

Но если я пытаюсь выполнить этот запрос, я получаю следующую ошибку:

exception: the $add operator does not accept an object as an operand

Однако, если я удалю эту строку:

                      '$add' => array(
                          '$multiply' => array('$priceMultiplierUser', '$lowEndUsers')
                      )

Из массива запрос выполняется отлично. Так что я использую то, что Монго жалуется, когда я пытаюсь вложить другой массив в $add ключ.

Как правильно написать запрос выше в PHP+Doctrine ODM?

1 ответ

Решение

Ответ был довольно прямым. Проблема заключалась в том, как я собирал BSON в PHP для отправки его в MongoDB.

Например, следующая часть:

             array(
                  '$add' => '$priceBase',
                  '$add' => array(
                      '$multiply' => array('$priceMultiplierUser', '$lowEndUsers')
                  )

второй "$add" переопределяет первый, создавая не только неверную формулу, но и неправильный BSON.

Должно быть так:

             array(
                  '$add' => array(
                      '$basePrice',
                        array(
                            '$multiply' => array('$priceMultiplierUser', '$lowEndUsers')
                        )
                  )

Так что при использовании json_encode в этом массиве я получаю что-то вроде этого:

            $add: [
                    "$priceBase",
                    { $multiply: ["$priceMultiplierJobOpenings", "$lowEndJobOpenings"] }
                ]

Какая является действительной агрегацией BSON в MongoDB

Другие вопросы по тегам