Doctrine ODM:add运算符不接受对象作为操作数

时间:2014-10-03 21:23:56

标签: mongodb symfony doctrine-orm doctrine-odm

我正在尝试使用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中编写上述查询的正确方法是什么?

1 个答案:

答案 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聚合