My goal is to subtract the current date from the stored date, and compared them to a saved interval value by the user.
I am running into the following error trying to use redact.
MongoResultException: localhost:27017: this object is already an operator expression, and can't be used as a document expression (at '0')
My code looks like this:
<?php
$ops = array(
array(
'$redact' => array(
'$cond' => array(
'if' => array(
'$gte' => array('$subtract' => array('$new Date()' , '$last_interacted_date'), '$reminder_interval')
),
'then' => '$$KEEP',
'else' => '$$PRUNE'
)
)
)
);
$results = $collection ->aggregate($ops);
For some reason the $subtract is causing this error. Why is the presence of subtract causing: "this object is already an operation expression'?
$new Date()
is not valid here. You want MongoDate
or MongoDB\BSON\UTCDateTime
appropriate to your driver instead.
$ops = array(
array(
'$redact' => array(
'$cond' => array(
'if' => array(
'$gte' => array(
'$subtract' => array(
new UTCDateTime(round(microtime(true) * 1000)),
'$last_interacted_date'
),
'$reminder_interval'
)
),
'then' => '$$KEEP',
'else' => '$$PRUNE'
)
)
)
);
$results = $collection ->aggregate($ops);
The interpolation of the Date
value actually happens in the "client" and "before" the aggregation pipeline is actually sent to the server. So you get the "milliseconds" as of "now" and send as a "BSON Date".
Note that this is "millseconds" in difference from the two BSON dates, so your "interval" needs to be in milliseconds, or otherwise do the math to convert further.