蒙戈搜索大量蒙戈IDS

问题描述:

//Search results for mongo_ids 
    foreach ($results->response->docs as $doc) 
    { 
     $mongo_ids[] = new MongoId($doc->mongo_id); 
    } 
    $search['_id'] = array('$in' => $mongo_ids); 

如果我有蒙戈id的100在搜索结果......将在蒙戈查询中很慢的?蒙戈搜索大量蒙戈IDS

默认情况下,_id字段被编入索引,因此IN查询应该非常快速,即使它的匹配很多记录。

我用数百个ID做同样的事情,从来没有任何性能问题。

+0

如果我的集合中有数千个文档,该怎么办?它会变慢吗? – guiomie 2012-04-15 14:52:57

+0

数以百计还行。成千上万的人几乎可以。数十万不会。我和一个大约300K文件的数据库有相同的问题,甚至与索引一样,它的速度非常慢,特别是当匹配的IDS列表很长时 – ibtarek 2012-09-16 15:15:42

当然,随着您在$in查询中使用的ID的数量增加,它会越来越成问题。在数千个ID的数组中,我们经历了查询执行时间的显着增加。

你可以看到有多少文件被扫描的同时,通过在MongoDB的外壳采用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)。当然,这取决于情况,这个例子很简单,但有时你可以通过反转关系来加快查询速度,也可以增加一些数据冗余。