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

时间:2016-04-23 01:22:34

标签: php mongodb mongodb-query aggregation-framework

我的目标是从存储日期中减去当前日期,并将其与用户保存的间隔值进行比较。

尝试使用redact时遇到以下错误。

  

MongoResultException:localhost:27017:此对象已经是一个运算符表达式,不能用作文档表达式(在'0')

我的代码如下所示:

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

由于某种原因,$ subtract导致此错误。为什么减法的存在导致:“这个对象已经是一个运算表达式了?”

1 个答案:

答案 0 :(得分:2)

$new Date()在此无效。您希望MongoDateMongoDB\BSON\UTCDateTime适合您的驱动程序。

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

Date值的插值实际上发生在&#34;客户端&#34; &#34;之前&#34;聚合管道实际上是发送到服务器的。所以你得到了&#34;毫秒&#34;截至&#34;现在&#34;并发送为&#34; BSON日期&#34;。

请注意,这是&#34;毫秒&#34;与两个BSON日期不同,所以你的&#34;间隔&#34;需要以毫秒为单位,或以其他方式进行数学运算以进一步转换。