2012-08-13 34 views
0

我已經嘗試了兩種不同的方式來使用Doctrine的MongoDB-ODM進行相同的查詢。爲什麼doctrine2 ODM的findBy()和createQueryBuilder() - > getQuery() - > execute()的結果各不相同?

你能弄清楚爲什麼這兩個,在我看來類似的查詢都返回不同的結果?代碼片段1不會返回片段2返回正確數據庫條目的任何內容。這兩個查詢在日誌文件中看起來很相似 - 除了#1沒有跳過限制行&。對於片段2

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

日誌條目:

片段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: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。

回答

0

使用查詢生成器方法的額外日誌輸出是由於Query::prepareCursor(),它始終設置其他遊標選項。如果提供非空值,則使用DocumentPersister::loadAll()的存儲庫findBy()方法僅設置選項。這解釋了日誌輸出的差異,但與結果集的差異無關。

除了ts條件的小漂移之外,每個示例的記錄查詢都是相同的。如果兩個遊標的count()值不同,並且在將光標解包爲iterator_to_array()後結果不同,我會建議嘗試在失敗的測試用例中重現此操作,並提交針對mongodb-odm存儲庫的拉取請求。

+0

再次感謝您,我會再回到這個問題上。 – 2012-08-13 19:15:36

相關問題