我正在尝试使用Doctrine ODM与我的mongo数据库进行交互,我正在尝试使用这个在MongoDB CLI中没有问题的mongo查询:
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
键中嵌套另一个数组时,我正在使用那个mongo抱怨。
在PHP + Doctrine ODM中编写上述查询的正确方法是什么?
答案 0 :(得分:1)
答案很简单。问题在于我在PHP中构建BSON以将其发送到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"] }
]
MongoDB中哪个是有效的BSON聚合