//Search results for mongo_ids
foreach ($results->response->docs as $doc)
{
$mongo_ids[] = new MongoId($doc->mongo_id);
}
$search['_id'] = array('$in' => $mongo_ids);
如果我在搜索结果中有100个mongo id ... mongo上的查询会非常慢吗?
答案 0 :(得分:2)
_id
字段默认为索引编制,因此IN查询应该非常快,即使它匹配许多记录也是如此。
我使用数百个ID做同样的事情,从不出现任何性能问题。
答案 1 :(得分:0)
当然,随着你在$in
查询中使用的id数量的增加,它会越来越成问题。我们使用几千个id的数组经历了查询执行时间的显着增加。
在MongoDB shell中使用explain()函数(或使用包装查询),您可以查看在执行查询时扫描的文档数量:
{"$query" : {"foo" : "bar"}, "$explain" : true}
扫描文档的数量应尽可能接近返回文档的数量。
只是一个可能对其他人有用的一般说明 - 有时您根本不需要$in
查询。如果您反转一对多关系,则可以简化查询。例如,如果您想要查找用户喜欢的歌曲,而不是具有以下结构:
user :
{
'likes' : [
ObjectId(song_id1),
ObjectId(song_id2),
...
]
}
你可以:
song :
{
'likedBy' : [
ObjectId(user_id1),
ObjectId(user_id2),
...
]
}
然后您可以查询{'likedBy' : ObjectId(yourUserId)}
(MongoDB将在数组中查找id)的歌曲。当然这取决于具体情况,这个例子很简单,但有时你可以通过反转关系来加速查询,并可能增加一些数据冗余。