2016-04-22 15 views
0

Ich versuche, zwei Daten in MonoDB unter Verwendung der Aggregation Framework subtrahieren.Subtrahieren von Daten in Mongo

Mein Code sieht wie folgt aus:

$ops = array(
    array('$project' => array("fieldMath" => 
    array('$subtract' => array('new ISODate()', 'new ISODate("last_interacted_date")')), 

    )), 
    array('$match' => array('fieldMath' => array('$gte' => 2), 
    ), 
    ), 
); 
$object -> aggregate($ops); 

Das Problem ist, ich erhalte eine Fehlermeldung, die ich 2 String zu subtrahieren versuche.

Fatal error: Uncaught exception 'MongoResultException' with message 'localhost:27017: cant $subtract aString from a String

new ISODate und die last_interacted_date sind beide ISODate Objekte.

Mein Ziel ist ein Datum "Last_did_something" von dem Datum heute abziehen und Ergebnisse für alle Abfragen, die innerhalb von 2 Tagen sind, zurückgeben.

Was mache ich falsch und wie kann ich Daten abziehen?

+0

Können Sie genau angeben, was Sie erreichen möchten, indem Sie einige Beispieldokumente und die erwartete Ausgabe hinzufügen? – chridam

+0

Add oben, grundsätzlich möchte ich alle Ergebnisse, in denen das Datum heute, wenn subtrahiert wird, größer als 2 Tage ist. –

+0

Sie sollten das Datum "außerhalb" der Abfrage berechnen. Sie haben dann nur eine normale Abfrage und müssen nicht aggregieren. Sie natürlich dazu in PHP. Es ist kein JavaScript, sondern BSON. Sie lassen den Fahrer die Übersetzung machen. –

Antwort

1

Da Sie nach Dokumenten suchen möchten, bei denen das Datumsfeld last_interacted_date größer oder gleich dem Datum vor zwei Tagen ist, müssen Sie ein neues Datumsobjekt (Datum vor 2 Tagen) erstellen, das Sie als Abfragevergleich verwenden können . Im Folgenden zeigt dies:

$start = new MongoDate(strtotime("-2 days")); 
$ops = array(
    array("$match" => array(
     "last_interacted_date" => array("$gte" => $start) 
     ) 
    )  
); 
$object -> aggregate($ops); 

können Sie eine nette Bibliothek verwenden genannt Carbon, die mit Datum/Uhrzeit in PHP viel einfacher und semantischer Umgang helfen können, so dass der Code besser lesbar und wartbar werden kann :

// get the current time 
$current = Carbon::now(); 

// subtract 2 days to the current time 
$start = $current->subDays(2); 

$ops = array(
    array("$match" => array(
     "last_interacted_date" => array("$gte" => $start) 
     ) 
    )  
); 
$object -> aggregate($ops); 
+0

Ihre Antwort funktioniert fast für mich, aber ich brauche die Anzahl der Tage, weil ich sie mit einer anderen Variablen vergleichen muss. –

Verwandte Themen