原则Mongodb ODM和DateTime查询


Doctrine Mongodb ODM and DateTime query

这个问题我需要一些帮助。我正在使用Symfony2 + mongodb +学说创建一个应用程序。我只是想使用Doctrine ODM来查询在过去5分钟内登录的所有用户。我有一个用户集合,其日期字段名为date_last_login。

所以我试着像这样使用querybuilder:
<?php
// Creating a DateTime object and susbtract 5 min from now
// local time is 15:40:05, timezone: 'Europe/Paris'
$_dateTime = new 'DateTime();
$_interval5Min = new 'DateInterval('PT5M');
$_dateTime->sub($_interval5Min);
$query = $this->createQueryBuilder('User')
                ->field('date_last_login')->gte($_dateTime)
                ->getQuery();
                ->execute();

当我使用symfony2分析器查看集合查询时,得到的结果如下:

db.User.find({ "date_last_login": { "$gte": new Date("Fri, 23 Dec 2011 15:30:05 +0100") } });

除了日期提前了10分钟而不是5分钟外,似乎没什么问题。我就是不明白。如果我转储我的php DateTime对象,日期是正确的:2011-12-23 15:35:05(15:40前五分钟)。

所以我试着组装相同的查询没有减去任何分钟,这一次,一切都很好:

<?php
// local time is 15:50:00
$query = $this->createQueryBuilder('User')
            ->field('date_last_login')->gte(new 'DateTime())
            ->getQuery();
            ->execute();
// query is ok:
db.User.find({ "date_last_login": { "$gte": new Date("Fri, 23 Dec 2011 15:50:00 +0100") } });

我做错了什么?谢谢你的帮助!

date_last_login大于5 minutes时创建查询生成器

1)创建DateTime对象与您的日期时间格式,并从DateTime对象得到timestamp,然后创建MongoDate对象:

$timeBefore5MinutesAgo  = new 'DateTime(date('Y-m-d H:i:s','time() - 5 * 60));
$mongoDateBefore5MinutesAgo = new 'MongoDate($currentDateWithTime->getTimestamp());
$query = $this->createQueryBuilder('User')
    ->field('date_last_login')->gte($mongoDateBefore5MinutesAgo)
    ->getQuery();
    ->execute();

2)创建MongoDate对象并使用strtotime将您的日期时间格式转换为timestamp:

$mongoDateBefore5MinutesAgo = new 'MongoDate(strtotime(date('Y-m-d H:i:s','time() - 5 * 60)));
$query = $this->createQueryBuilder('User')
    ->field('date_last_login')->gte($mongoDateBefore5MinutesAgo)
    ->getQuery();
    ->execute();

3)只有在Doctrine 2 ODM的情况下,你可以用你的日期时间格式创建DateTime对象:

$timeBefore5MinutesAgo  = new 'DateTime(date('Y-m-d H:i:s','time() - 5 * 60));
$query = $this->createQueryBuilder('User')
              ->field('date_last_login')->gte($timeBefore5MinutesAgo)
              ->getQuery();
              ->execute();

所有三种方法将创建如下查询:

db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } });

这可能是由于这个PHP错误,该错误已在5.3.3中修复:

https://bugs.php.net/bug.php?id=50916