2016-04-22 8 views
0

私は、aggreationフレームワークを使用してMonoDBで2つの日付を減算しようとしています。Mongoで日付を引く

私のコードは次のようになります。

$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); 

問題は、私は、私は2文字列を減算するしようとしているエラーを取得しています。

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

new ISODatelast_interacted_dateは両方ISODateオブジェクトです。

私の目標は、今日の日付から 'last_did_something'日付を引き、2日以内のすべてのクエリの結果を返します。

私は間違っていると私はどのように日付を引くことができますか?

+0

いくつかのサンプルドキュメントと予想される出力を含めることで、達成しようとしていることを正確に特定できますか? – chridam

+0

上記を追加すると、基本的に、今日の減算された日付が2日を超えるすべての結果が欲しいです。 –

+0

クエリの「外側」の日付を計算する必要があります。次に、定期的なクエリがあり、集約する必要はありません。あなたはもちろんこれをPHPで行います。それはJavaScriptではなくBSONです。ドライバーに翻訳をさせてください。 –

答えて

1

last_interacted_date日付フィールドが2日以上前のドキュメントを照会する場合は、クエリの比較として使用できる新しい日付オブジェクト(2日前の日付)を作成する必要があります。あなたはあなたのコードがより読みやすく、メンテナンス性になることができるように非常に簡単に、より意味的なPHPの日付/時刻を扱うことができますCarbonと呼ばれる気の利いたライブラリを使用することができます

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

:以下は、このことを示してい:

// 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

あなたの答えはほとんど私のために働くが、私は別の変数と比較する必要があるので、日数が必要である。 –