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