0

DoctrineのMongoDB-ODMで同じクエリを実行する2つの異なる方法を試しました。

私の意見では、2つのクエリが両方とも異なる結果を返す理由を理解できますか?Snippet 1は、Snippet2が正しいデータベースエントリを返す場合は何も返しません。両方のクエリはログファイルで類似しているように見えます-#1にスキップ行と制限行がないことを除いて。

スニペット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]);

Snippet 1からのSymfonyのログエントリ:

[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();

Snippet 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を取得します。

4

1 に答える 1

0

クエリビルダーメソッドでの追加のログ出力は、常に追加のカーソルオプションを設定するQuery :: prepareCursor()によるものです。DocumentPersister :: loadAll()を利用するリポジトリfindBy()メソッドは、null以外の値が指定された場合にのみオプションを設定します。これはログ出力の違いを説明していますが、結果セットの違いとは関係ありません。

ts各例のログに記録されたクエリは、基準のわずかなずれを除けば同じです。両方のカーソルの値が異なり、 iterator_to_array()count()でカーソルをアンラップした後の結果が異なる場合は、失敗したテストケースでこれを再現し、mongodb-odmリポジトリに対してプルリクエストを送信することをお勧めします。

于 2012-08-13T18:53:02.357 に答える