Mongo $ redact这个对象已经是一个运算符表达式Error

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.