2016-08-23 2 views
2

Ich habe bereits eine Lösung, aber ich bin auf der Suche einer Lösung, die den Job alle auf MongoServer tut (Weil ich denke, es schneller sein würde und weniger Speicher raubend)Wie erhält man die Summe der Differenzen zweier Felder in MongoDB?

ich eine Klasse Methode haben wie:

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

Jetzt gibt es eine Möglichkeit zur Berechnung der Summe der Unterschiede der beiden Felder mit aggregate Methode von MongoDB? Gibt es einen anderen effizienteren Weg, dies zu tun?

Antwort

2

Der Aggregationsansatz sollte diese Pipeline hat:

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

die äquivalent PHP Beispielimplementierung:

$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

perfekt funktioniert. Ich habe mich gefragt, wie das funktioniert, wenn eines oder beide der Felder in $ subtract Strings sind? – eNeMetcH

+1

Der einzige unglückliche Teil ist, $ subtract' funktioniert nicht gut mit Strings, da die Argumente für den Operator ein beliebiger gültiger Ausdruck sein können, solange sie in Zahlen und/oder Datumsangaben aufgelöst werden. Sie benötigen also einen Mechanismus, um die Strings in eine numerische Darstellung zu konvertieren, damit dies funktioniert. – chridam

Verwandte Themen