2016-08-23 98 views
2

我已經有一個解決方案,但我在看這確實對MongoServer所有作業(因爲我覺得這是更快,更少的內存消耗)如何獲得MongoDB中兩個字段的差異總和?

我有一類方法的解決方案,如:

function getTotalOutstandingAmount(){ 
    $outstandingAmount = 0; 
    $subs = $this->mongo->selectCollection('SmsSubscriptions'); 
    $activeSubsctiptions = $subs->find(array('Status' => 1, '$where' => "this.SubscriptionPayments < this.SubscriptionTotal")); 
    foreach ($activeSubsctiptions AS $sub){ 
     $outstandingAmount += $sub['SubscriptionTotal'] - $sub['SubscriptionPayments']; 
    } 

    return $outstandingAmount; 
} 

現在有沒有一種方法可以使用MongoDB的aggregate方法計算兩個字段的差值之和?有沒有其他更有效的方式來做到這一點?

回答

2

聚集的做法應該有這樣的管道:

db.SmsSubscriptions.aggregate([ 
    { 
     "$project": { 
      "outstandingAmount": { 
       "$subtract": ["$SubscriptionTotal", "$SubscriptionPayments"] 
      }, 
      "Status": 1 
     } 
    }, 
    { "$match": { "Status": 1, "outstandingAmount": { "$gt": 0 } } }, 
    { 
     "$group": { 
      "_id": null, 
      "totalOutstandingAmount": { "$sum": "$outstandingAmount" } 
     } 
    } 
]) 

等價的PHP示例實現:

$ops = array(
    array(
     "$project" => array(
      "Status" => 1, 
      "outstandingAmount" => array(    
       "$subtract" => array("$SubscriptionTotal", "$SubscriptionPayments") 
       ) 
      )   
     ) 
    ), 
    array( 
     "$match" => array( 
      "Status" => 1, 
      "outstandingAmount" => array("$gt" => 0) 
     ) 
    ), 
    array(
     "$group" => array(
      "_id" => null, 
      "totalOutstandingAmount" => array("$sum" => "$outstandingAmount") 
     ) 
    ) 
); 
$results = $this->mongo->selectCollection('SmsSubscriptions')->aggregate($ops); 
+0

完美的作品。我想知道如何使這項工作,如果一個或兩個'$減'字段是字符串? – eNeMetcH

+1

唯一不幸的部分是'$ subtract'對於字符串不能很好地工作,因爲只要它們解析爲數字和/或日期,操作符的參數可以是任何有效的表達式。所以你需要一個機制來將字符串轉換爲一些數字表示。 – chridam

相關問題