Mongodb 运营商绩效中的Mongo$

Mongodb 运营商绩效中的Mongo$,mongodb,Mongodb,在MongoDB中使用$in操作符的速度慢/效果差吗 posts.find({ author : { $in : ['friend1','friend2','friend3'....'friend40'] } }) 例如,appengine不允许您使用超过30个,因为它们直接转换为in数组中每个项的一个查询,因此会强制您使用它们的方法进行处理。虽然这可能也是Mongo中最有效的方法,但它的代码要复杂得多,所以我更喜欢使用这种通用方法 Mongo能否有效地执行这

在MongoDB中使用
$in
操作符的速度慢/效果差吗

posts.find({
    author : {
        $in : ['friend1','friend2','friend3'....'friend40'] 
    }
})
例如,appengine不允许您使用超过30个,因为它们直接转换为in数组中每个项的一个查询,因此会强制您使用它们的方法进行处理。虽然这可能也是Mongo中最有效的方法,但它的代码要复杂得多,所以我更喜欢使用这种通用方法


Mongo能否有效地执行这些
$in
查询,以获得大小合理的数据集?

对于小列表(很难说什么是小列表,但至少是十个/百个)来说,只需$in就相当有效了。它不像appengine那样工作,因为mongodb有实际的btree索引,并且不像bigtable那样是列存储

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

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

您是否尝试过使用explain()?这是一种很好的内置方式来分析您的查询:
.

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

$in
操作的时间复杂度不会改变,除非你改变一个数据库(尽管我认为任何数据库都不能破坏
O(N*log(M))

但是,从工程的角度来看,如果
N
的数量很大,最好让业务逻辑服务器模拟
$in
操作,可以是批量操作,也可以是逐个操作


这仅仅是因为:数据库服务器中的内存比业务逻辑服务器中的内存更有价值

你有关于作者字段的索引吗?你好@Derek Dahmer,你能克服这个问题吗?我一直在处理这个问题。今天MongoDB将此架构师命名为Edge Collection:)我也希望将$in参数用于大型数组。但我要小心对性能的影响!出于好奇,b-树和列存储之间有什么区别,使得GAE需要将每个存储都作为单独的查询?GAE不能跳过索引吗?好吧,appengine中的AFAIK索引是在列存储的顶部实现的。这意味着您只能进行范围查询,不能像使用btree结构那样轻松地在内存中跳过。Cassandra的工作方式与GAE相同,它使用列存储来维护索引数据。