私はこの問題についていくらかの助けを使うことができました。Symfony2 + mongodb+doctrineを使用してアプリケーションを作成しています。Doctrine ODMを使用して、過去5分間にログインしたすべてのユーザーにクエリを実行したいだけです。date_last_loginという日付フィールドを持つUserコレクションがあります。
だから私はそのようなクエリビルダーを使おうとします:
<?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") } });
日付が5分ではなく10分早いことを除けば問題ないようです。わからない。php DateTimeオブジェクトをダンプした場合、日付は正しいです:2011-12-23 15:35:05(15:40の5分前)。
そこで、分を差し引くことなく同じクエリを組み立てようとしましたが、今回はすべて問題ありません。
<?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") } });
私は何を間違っているのですか?ご協力ありがとうございました!