我目前正在从couchdb迁移到mongodb,仍在学习这些东西,并且在我的网页中进行排序的任何时候都会遇到问题。 我使用codeigniter作为框架,并使用alexbilbie lib作为mongodb php库。
所以,这是我的问题: 我打算从每隔一秒更新的房间中的传感器进行查询(因此,已经在集合中保存了数千个文档)并获取每个最新的传感器值我从模型中使用此查询:
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" : {
}
答案 0 :(得分:1)
好的,谢谢大家的回复:)这是我在尝试使用索引后的发现:
根据查询中最需要的方式构建索引/复合索引。例如,在我的问题中,我的查询基于SensorId
和_id
:DESCENDING,因此优化查询的最佳策略是:
db.your_collection.ensureIndex({ "SourceId" : 1, "_id" : -1 },{ "name" : "sourceid_idx", "background" : true });
或者在其他情况下,如果我需要它基于时间戳:
db.your_collection.ensureIndex({ "SourceId" : 1, "timestamp" : -1 },{ "name" : "source_idx", "background" : true });
我找到了关于mongodb索引here
的非常好的解释希望这会有助于其他偶然发现类似问题的人......