如何使用MongoDB和Laravel 5.2匹配聚合$ match中的日期?

时间:2016-06-16 11:02:15

标签: php mongodb laravel-5.2

我在mongodb收藏中有超过5万条记录。为了避免laravel中的foreach循环,我在查询中使用聚合。

$start = new MongoDate(strtotime("2015-10-01 00:00:00"));
$result = Pms::raw(function ($collection) use($start){
        return $collection->aggregate(array(
            array( '$project' => array( 'EventTS' => 1, 'MainsPower' => 1, '_id' => 0) ),
            array(
                '$unwind' => array(
                    'path' => '$MainsPower',
                    'includeArrayIndex' => "arrayIndex",
                    'preserveNullAndEmptyArrays' => true
                )
            ),
            array(
                '$match' => array(
                    'EventTS' => array(
                        '$gte' => $start
                    )
                )
            ),                
            array(
                '$project' => array(
                    'MainsPower' => 1,
                    'timestamp' => array(
                        '$add' => array(
                            '$EventTS',
                            array( '$multiply' => array( 60000, '$arrayIndex' ) )
                        )
                    )
                )
            )
        ));
    })->toArray();

我需要将日期与集合进行比较,但如果我使用下面的代码,那么我的结果集将返回空。

 array(
            '$match' => array(
                'EventTS' => array(
                    '$gte' => $start
                )
            )
        )

使用Laravel 5.2在PHP中的mongodb集合中比较日期的正确方法是什么。

附件是样本文件

{ 
    "_id" : ObjectId("576165f58d8b8f39458b456a"), 
    "EventTS" : ISODate("2000-05-11T05:30:00.000+0000"), 
    "PanelID" : "A01000", 
    "MainsPower" : [
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        NumberInt(147), 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null
    ], 
}

{ 
    "_id" : ObjectId("576165f58d8b8f39458b456b"), 
    "EventTS" : ISODate("2016-06-08T18:30:00.000+0000"), 
    "PanelID" : "A01604", 
    "MainsPower" : [
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null, 
        null
    ]
}

1 个答案:

答案 0 :(得分:1)

另一种方法是使用Carbon createFromDate() 属性来创建日期范围,因为Laravel还支持Carbon或{{1} }对象而不是MongoDate对象,当保存到数据库时,它们将在内部转换为MongoDate对象。

在与上述相同的广度中,您需要重新构建聚合操作,以便 $match之前 $unwind 过滤器首先位于管道中操作,这样就可以优化聚合操作,因为DateTimeEventsTS数组中的一个独立字段(至少从编写代码的方式)。

此外,您不需要初始项目操作员,在管道的另一端,您还有另一个 $project 操作员,它只返回所需的字段。

因此,应用Carbon包,您可以尝试以下管道:

MainsPower