2014-12-02 55 views
1

我在我的Mongo數據庫中有一個名爲WorkOrder的集合,其中有兩個字段DateCompleteDateDue。使用這兩個字段,我想使用聚合框架通過比較兩個字段來計算「延遲」工作訂單的數量。然而,我發現的研究還沒有任何有用的方法來格式化查詢,以便「晚」工作訂單將被過濾。有誰知道一種方法來格式化MongoDB聚集查詢(最好用PHP),可以比較集合中的兩個字段?比較Mongo Aggregation查詢中的2個字段

編輯:

在工單一個示例項可能看起來像

_id

一些蒙戈ID

DateDue

2014年10月

DateCompleted

2014-10-12

此條目由於DateCompleted大於DateDue而需要過濾。我不知道$ cond操作符,所以我還沒有嘗試過。

編輯:

在我的PHP腳本

array(
    '$cond' => array(
     'if' => array(
      'dateDue' => array(
       '$lt' => 'dateComplete 
      ) 
     ) 
    ) 
) 

用下面的查詢試圖@ BatScream的建議,然而,MongoCollection::Aggregate功能告訴我,$cond沒有一個公認的操作後。

編輯︰@ BatScream的答案似乎工作,但我沒有意識到這樣的事實,組運營商應用$項目後無法正常工作。我希望能夠將這些文件在另一個字段cID上分組,這是可能的嗎?

+1

您需要使用'$ cond'和'$ gt'運營商一起投影一個新領域並根據投影領域進行計算。請張貼一些示例數據以及您嘗試的內容。 – BatScream 2014-12-02 19:01:10

+0

你可以粘貼完整的管道和關於'$ cond'的錯誤嗎?它絕對是一個真正的agg運算符,但它屬於'$ project'階段,而不是'$ match'階段。 – wdberkeley 2014-12-03 06:51:17

回答

2

下面的聚合管道會給你結果,考慮到你的字段是ISODate類型。如果不是,我建議你將它們存儲爲ISODate類型和而不是字符串。

db.collection.aggregate([ 
{$project:{"isLateWorkOrder":{$cond:[{$lt:["$dateDue","$dateCompleted"]}, 
          true,false]}}}, 
{$match:{"isLateWorkOrder":true}}, 
{$group:{"_id":null,"lateWorkOrders":{$sum:1}}}, 
{$project:{"_id":0,"lateWorkOrders":1}} 
]) 

的PHP語法應該類似,

$projA = array("isLateWorkOrder" => 
       array("$cond" => 
          array(array("$lt" => 
      array("$dateDue","$dateCompleted")), 
      true,false)))       
$matchA = array("isLateWorkOrder" => true) 
$grp = array("_id" => null,"lateWorkOrders" => array("$sum" => 1)) 
$projB = array("_id" => 0,"lateWorkOrders" => 1) 

$pipeline = array($projA,$matchA,$grp,$projB); 
$someCol -> aggregate($pipeline) 

,或者乾脆使用count功能:

db.collection.count({$where:"this.dateDue < this.dateCompleted"}) 
+0

這段代碼主要工作,除了任何在PHP中帶有$的引號都應該用單引號引起來,否則$需要被轉義,以便PHP不會將其解釋爲變量。 – 2014-12-03 14:35:52