我目前正在从 couchdb 迁移到 mongodb,仍在学习这些东西,并且每当我在网页中进行一些排序查询时都会遇到问题。我使用 codeigniter 作为框架,并使用alexbilbie lib for mongodb php library。
所以,这是我的问题:我打算从房间中的传感器进行查询,每秒更新一次(因此,已经保存了数千个文档)并获取每个最新的传感器值,我使用来自模型的查询:
function mongoGetDocLatestDoc($sensorid){
$doc = $this->mongo_db->where(array('SensorId'=>$sensorid))->limit(1)->order_by(array('_id'=>'DESC'))->get('my_mongo');
return $doc;
}
如果我用我的控制器调用它,处理查询会花费大量时间,如果我更改时间戳排序,情况会更糟。每次我为第二个传感器再次调用它时,延迟都会增加一倍,更不用说我有超过 10 个传感器需要在同一页面中进行此查询。我做错了还是有一些更有效的方法可以从收集中获取最新数据?
编辑:@Sammaye:我尝试根据您的建议创建索引,这是执行查询后生成的解释:
"cursor" : "BtreeCursor timestamp_desc",
"nscanned" : 326678,
"nscannedObjects" : 326678,
"n" : 50,
"millis" : 4402,
"nYields" : 7,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"timestamp" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
}
根据比较,这解释了不使用索引的第一个查询(执行速度更快):
"cursor" : "BasicCursor",
"nscanned" : 385517,
"nscannedObjects" : 385517,
"n" : 50,
"millis" : 1138,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}