mongo寻找大量的mongo id

时间:2012-03-13 19:37:41

标签: php mongodb

    //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上的查询会非常慢吗?

2 个答案:

答案 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)的歌曲。当然这取决于具体情况,这个例子很简单,但有时你可以通过反转关系来加速查询,并可能增加一些数据冗余。