Почему результаты findBy() и createQueryBuilder()->getQuery()->execute() в ODM Doctrine2 отличаются друг от друга?

Я попробовал два разных способа выполнить один и тот же запрос с MongoDB-ODM от Doctrine.

Можете ли вы понять, почему два, на мой взгляд, похожих запроса возвращают разные результаты? Фрагмент 1 ничего не возвращает, тогда как фрагмент 2 возвращает правильные записи базы данных. Оба запроса кажутся похожими в файле журнала, за исключением того, что в первом нет строк пропуска и ограничения.

Фрагмент 1

$dateDayAgo = new \DateTime('1 day ago');
$recentLogins = $this->get('user_activity_tracker')->findBy(array(
      'targetUser' => $userAccount->getId(),
      'code' => array('$in' => array('login.attempt','login.ok')),
      'ts' => array('$gte', $dateDayAgo)
    ))->sort(['ts' => 1]);

Записи журнала Symfony из фрагмента 1:

[2012-08-13 09:14:33] doctrine.INFO: MongoDB query: { "find": true, "query": { "targetUser": ObjectId("4fa377e06803fa7303000002"), "code": { "$in": [ "login.attempt", "login.ok" ] }, "ts": [ "$gte", new Date("Sun, 12 Aug 2012 09:14:33 +0000") ] }, "fields": [ ], "db": "eventio_com", "collection": "ActivityEvent" } [] []
[2012-08-13 09:14:33] doctrine.INFO: MongoDB query: { "sort": true, "sortFields": { "ts": 1 }, "query": { "targetUser": ObjectId("4fa377e06803fa7303000002"), "code": { "$in": [ "login.attempt", "login.ok" ] }, "ts": [ "$gte", new Date("Sun, 12 Aug 2012 09:14:33 +0000") ] }, "fields": [ ] } [] []

Фрагмент 2

$recentLoginsQuery = $this->get('user_activity_tracker')->createQueryBuilder()
        ->field('targetUser')->equals($userAccount->getId())
        ->field('code')->in(array('login.attempt','login.ok'))
        ->field('ts')->gte($dateDayAgo)
        ->sort('ts','asc')
        ->getQuery();

$recentLogins = $recentLoginsQuery->execute();

Записи журнала для фрагмента 2:

[2012-08-13 09:17:30] doctrine.INFO: MongoDB query: { "find": true, "query": { "targetUser": ObjectId("4fa377e06803fa7303000002"), "code": { "$in": [ "login.attempt", "login.ok" ] }, "ts": { "$gte": new Date("Sun, 12 Aug 2012 09:17:30 +0000") } }, "fields": [ ], "db": "eventio_com", "collection": "ActivityEvent" } [] []
[2012-08-13 09:17:30] doctrine.INFO: MongoDB query: { "limit": true, "limitNum": null, "query": { "targetUser": ObjectId("4fa377e06803fa7303000002"), "code": { "$in": [ "login.attempt", "login.ok" ] }, "ts": { "$gte": new Date("Sun, 12 Aug 2012 09:17:30 +0000") } }, "fields": [ ] } [] []
[2012-08-13 09:17:30] doctrine.INFO: MongoDB query: { "skip": true, "skipNum": null, "query": { "targetUser": ObjectId("4fa377e06803fa7303000002"), "code": { "$in": [ "login.attempt", "login.ok" ] }, "ts": { "$gte": new Date("Sun, 12 Aug 2012 09:17:30 +0000") } }, "fields": [ ] } [] []
[2012-08-13 09:17:30] doctrine.INFO: MongoDB query: { "sort": true, "sortFields": { "ts": 1 }, "query": { "targetUser": ObjectId("4fa377e06803fa7303000002"), "code": { "$in": [ "login.attempt", "login.ok" ] }, "ts": { "$gte": new Date("Sun, 12 Aug 2012 09:17:30 +0000") } }, "fields": [ ] } [] []

Моя служба user_activity_tracker работает как прокси для базового репозитория/менеджера документов Doctrine. Оба фрагмента возвращают LoggableCursor после запроса.


person Ville Mattila    schedule 13.08.2012    source источник


Ответы (1)


Дополнительный вывод журнала с помощью метода построителя запросов связан с Query::prepareCursor(), который всегда устанавливает дополнительные параметры курсора. Метод репозитория findBy(), который использует DocumentPersister::loadAll() устанавливает параметры, только если указано ненулевое значение. Это объясняет разницу в выводе журнала, но не связано с разницей наборов результатов.

Зарегистрированные запросы для каждого примера идентичны, за исключением небольшого расхождения в критериях ts. Если значения count() обоих курсоров отличаются, и результаты отличаются после развертывания курсора с помощью iterator_to_array(), я бы предложите попытаться воспроизвести это в неудачном тестовом примере и отправить запрос на включение в репозиторий mongodb-odm .

person jmikola    schedule 13.08.2012
comment
Еще раз спасибо, я еще вернусь к этой теме позже. - person Ville Mattila; 13.08.2012