来自PHP的MongoDB奇怪的行为

时间:2015-06-12 12:02:36

标签: php mongodb mongodb-query nosql

我们有一个包含MongoDB安装的虚拟机以及php5和apache 2 Server。 在我们执行涉及" $ lt"的范围查询时,在此虚拟机(机器A)中来自MongoDB shell的opperator查询执行正常返回一些结果。 当我们从php执行相同的查询时,不返回任何结果。奇怪的是,当我们从PHP执行a" $ gt"查询结果是否正确。

我们将MongoDB主机更改为另一台机器让我们说B.在机器B上,我们使用" $ lt"执行php脚本。运算符并正确运行。同样来自机器B的mongo shell。 在机器A上使用相同的脚本使用机器B的MongoDB在" $ lt"操作

我们删除了完整的php5以及php5-mongo,重新安装后问题仍然存在。

重要提示:当我们从php5执行" $ lt"范围查询使用较小的集合(5个记录而不是10个),查询是正常执行的。

由于小型虚拟机上的大型集合大小,这可能是一个问题吗? " $ lt"立即返回,就像它甚至没有检查结果。只有一个空光标没有返回错误。

(查询列有一个索引并快速返回mongo shell的结果)

示例:

这是MongoShell查询:

db.BusData.find({"timestamp":{"$lt":1434037467000000000}})

返回许多对象! (42616452)

PHP的代码:

$dateFrom=$dateFrom=1433036880000;
$dateTo=1434037467000000000;
$mongoHost = "XXX.XXX.XXX.XX";
$mongoName = 'BusISA_DB'; 
// Connect to test database  
$m = new MongoClient("mongodb://$mongoHost");  
$db = $m->$mongoName;
// select the collection  
$collection = $db->BusData;
$rangeQuery = array('timestamp' => array('$lt' => $dateTo));
$cursor = $collection->find($rangeQuery);
echo json_encode($rangeQuery);
//Output:{"timestamp":{"$lt":1434037467000000000}}
foreach($cursor as $document) {
        print_r($document);
}

返回空结果。 打印的查询是:{" timestamp":{" $ lt":1434037467000000000}} 使用dateFrom和" $ gt"返回许多结果。 dateFrom<

2 个答案:

答案 0 :(得分:1)

解决方案:!

事实证明我在机器A上使用的php5-mongo驱动程序存在问题。

在我在问题中引用的机器B上使用了http://docs.mongodb.org/ecosystem/drivers/php/中描述的MongoDB驱动程序。

在机器A上安装上述驱动程序后,lt opperator正在运行。可能这是php5-mongo驱动程序的错误。

答案 1 :(得分:0)

根据您所描述的内容,由于大量查询,它确实听起来像是内存问题(尽管MongoClient使用游标因此通常不会出现问题)。确保您已在PHP中打开错误报告并检查日志。同时检查您的查询是否不会抛出MongoException。如果没有,你可以尝试不同的查询,所以如果你能确定故障的临界点是什么。