【问题标题】:Doctrine ODM: add operator does not accept an object as an operandDoctrine ODM:add 运算符不接受对象作为操作数
【发布时间】:2014-10-04 06:15:12
【问题描述】:

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

【问题讨论】:

    标签: mongodb symfony doctrine-orm doctrine-odm


    【解决方案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 聚合

    【讨论】:

      猜你喜欢
      • 2020-02-28
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多