2014-01-26 46 views
3

我正在分片MongoDb設置上運行一個非常基本的腳本來選擇給定日期的消息數量。 然而,運行此多次,導致不一致的結果,有時它返回的數量,有時它只是返回0PHP MongoDB與MongoDate上的查詢不一致的結果

MongoDB服務器具有版本2.4.3

這裏我錯過什麼?

這是腳本:

<?php 

$mongo = new MongoClient("mongodb://127.0.0.1:27017"); 
$db = $mongo->selectDB('database'); 

$messages = $db->selectCollection('messages'); 

$date1 = new MongoDate(strtotime('2013-10-20')); 
$date2 = new MongoDate(strtotime('2013-10-21')); 

var_dump($date1); 
var_dump($date2); 

$iterator = $messages->find(array('date_replied' => array('$gte' => $date1, '$lt' => $date2))); 

$count = $iterator->count(); 
var_dump($count); 

這是結果,2次後對方直接奔:

~$ php -f mongo.php 
object(MongoDate)#4 (2) { 
    ["sec"]=> 
    int(1382220000) 
    ["usec"]=> 
    int(0) 
} 
object(MongoDate)#5 (2) { 
    ["sec"]=> 
    int(1382306400) 
    ["usec"]=> 
    int(0) 
} 
int(494921) 
~$ php -f mongo.php 
object(MongoDate)#4 (2) { 
    ["sec"]=> 
    int(1382220000) 
    ["usec"]=> 
    int(0) 
} 
object(MongoDate)#5 (2) { 
    ["sec"]=> 
    int(1382306400) 
    ["usec"]=> 
    int(0) 
} 
int(0) 
+0

您是否將讀取內容定位到次要成員?另外,'database.messages'集合如何分割?如果要單獨連接到碎片,請對每個碎片運行查詢,然後對結果進行總結,是否等於預期的數量? – jmikola

回答

2

您的數據庫可能已損壞。你可以做一個db.repairDatabase()並再試一次嗎?它嘗試重新創建索引失敗,我遇到了與分佈式集合類似的問題。

請記住,修復將阻止整個數據庫操作,並可能丟棄任何損壞的數據。謹慎行事!

+0

這似乎是一個不成熟的建議。您懷疑哪些數據損壞會保證完整的數據庫修復?如果實際的BSON數據損壞,我們可能會從服務器報告中看到異常(例如,無效的長度,無效的類型字段)。鑑於涉及分片的簇,調查塊分佈似乎是一個更合理的起點。 – jmikola