首页 文章

Mongo $ in运营商表现

提问于
浏览
35

在MongoDB中使用带有大量可能性的$ in运算符是缓慢/差的形式吗?

posts.find({
    author : {
        $in : ['friend1','friend2','friend3'....'friend40'] 
    }
})

例如,App Engine不允许您使用超过30个,因为它们直接转换为IN数组中每个项目的一个查询,因此强制您使用它们的方法来处理fan out . 虽然这可能是Mongo中最有效的方法,但它的代码要复杂得多,所以我更喜欢使用这种通用方法 .

Mongo会有效地为合理大小的数据集执行这些$ in查询吗?

3 回答

  • 6

    如果在list元素上构建索引(ensureIndex),它应该非常快 .

    你尝试过使用explain()吗?它是一种很好的内置方式来查询您的查询:http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Use%7B%7Bexplain%7D%7D .

  • 20

    假设您已经在 author 字段上创建了索引,从算法的角度来看, $in 操作的时间复杂度为: $(N*log(M)) ,其中 N 是输入数组的长度, M 是集合的大小 .

    除非您更改数据库,否则 $in 操作的时间复杂度将为 not change (尽管我认为任何数据库都不能破坏 O(N*log(M)) ) .

    但是,从工程角度来看,如果 N 变为大数字,最好让业务逻辑服务器按批处理或逐个模拟 $in 操作 .

    这只是因为:数据库服务器中的内存比业务逻辑服务器中的内存更有 Value .

  • 10

    对于$ in,它可以相当有效地使用小列表(很难说小,但至少是几十/几百) . 它不像app-engine那样工作,因为mongodb有实际的btree索引而且不像bigtable这样的列存储 .

    使用$ in,它将在索引中跳过以查找匹配的文档,或者如果没有要使用的索引,则遍历整个集合 .

相关问题