2014-10-03 24 views
0

我試圖使用Doctrine ODM與我的mongo數據庫進行交互,並且我試圖使用這個在MongoDB CLI中沒有問題的情況下運行的mongo查詢:Doctrine ODM:添加操作符不接受作爲操作數的對象

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 } 
    } 
]); 

教義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') 
        ) 

從陣列中,查詢運行非常好。所以我使用的是mongo在我嘗試嵌入$add密鑰中的另一個數組時遇到的抱怨。

在PHP + Doctrine ODM中編寫上述查詢的正確方法是什麼?

回答

1

答案非常簡單。問題在於我在PHP中構建BSON以將其發送到MongoDB。

例如,以下部分:

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

第二「$附加」覆蓋第一個,從而不僅產生了無效的公式,但也產生了錯誤的BSON。

它應該是這樣的:

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

這樣,該陣列上使用json_encode的時候,我結束了這樣的事情:

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

這是MongoDB的有效BSON聚集