2014-01-26 45 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