Mongo在两个日期

时间:2016-05-25 12:47:03

标签: php arrays mongodb date

我有一个数组属性timestamps的文档,如下面的文档所示。我希望找到两个日期之间的时间戳的所有文档。我的查找查询如下:

    $subset = $db->col->find(
            array( 
                'timestamps'=> array(
                    '$elemMatch'=> array(
                        '$gte'=> new MongoDate(strtotime('2016-05-25 13:00:00')),
                        '$lte'=> new MongoDate(strtotime('2016-05-25 14:00:00'))
                    )
                )
            )
    );

但它没有返回预期的文件。我尝试使用Google并搜索StackOverflow以获得答案,但我找不到任何解释如何在两个日期之间搜索数组中的时间戳的内容。

修改

问题似乎在于PHP,因为相同的Python查询有效:

import datetime
f = '%Y-%m-%d %H:%M:%S'
c = db.col.find({
        'timestamps': {
            '$elemMatch': {
                '$gte': datetime.datetime.strptime('2016-05-25 13:00:00', f),
                '$lte': datetime.datetime.strptime('2016-05-25 14:00:00', f)
            }
        }
    })

任何帮助都将不胜感激。

{
    "month": {
        "$date": 1464134400000
    }, 
    "timestamps": [
        {
            "$date": 1464181803000
        }, 
        {
            "$date": 1464182103000
        }, 
        {
            "$date": 1464182403000
        }, 
        {
            "$date": 1464183003000
        }, 
        {
            "$date": 1464183603000
        }, 
        {
            "$date": 1464184203000
        }, 
        {
            "$date": 1464184803000
        }, 
        {
            "$date": 1464185403000
        }, 
        {
            "$date": 1464186003000
        }
    ], 
    "status_history": [
        1, 
        1, 
        1, 
        0, 
        1, 
        1, 
        1, 
        0, 
        1
    ], 
    "_id": 12345
}

我查看了find in array between dates in mongoGet data between two dates mongo

1 个答案:

答案 0 :(得分:0)

这是一个时区问题。我创建了DateTime并将时区设置为Etc/GMT,并且正确返回了预期的数据。

$gte = new MongoDate (new DateTime( '2016-05-25 13:00:00', new DateTimeZone( 'Etc/GMT' )));
$lte = new MongoDate (new DateTime( '2016-05-25 14:00:00', new DateTimeZone( 'Etc/GMT' )));