2012-03-13 192 views
2
//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

回答

2

默認情況下,_id字段被編入索引,因此IN查詢應該非常快速,即使它的匹配很多記錄。

我用數百個ID做同樣的事情,從來沒有任何性能問題。

+0

如果我的集合中有數千個文檔,該怎麼辦?它會變慢嗎? – guiomie 2012-04-15 14:52:57

+0

數以百計還行。成千上萬的人幾乎可以。數十萬不會。我和一個大約300K文件的數據庫有相同的問題,甚至與索引一樣,它的速度非常慢,特別是當匹配的IDS列表很長時 – ibtarek 2012-09-16 15:15:42

0

當然,隨着您在$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)。當然,這取決於情況,這個例子很簡單,但有時你可以通過反轉關係來加快查詢速度,也可以增加一些數據冗餘。