我有一个关于在MongoDB中设计索引的问题。
假设我有一个用户集合和组集合。
user {
name : "" ,
age : 19
}
group {
name : ""
members : [],
posts : [ { date : "" , author : "" , topic : "" }, { date : "" ,
author : "" , topic : "" } ......]
}
可以有1000个群组,每个群体可以拥有数百万个群组 帖子。我经常执行的操作是:
所以,基本上我需要在日期上编制索引。
我的问题是:
我应该创建像
这样的新帖子集合吗?posts {
name : "", date : "" , author : "" , topic : ""
}
并在帖子集合中创建一个单值索引
( db.posts.ensureIndex({posts : 1}) )
或
我应该在组对象中包含帖子并创建嵌入式
索引如db.groups.ensureIndex({ posts.date : 1})
哪一个效率更高?如果需要,最好的做法是什么? 扩展到数百万个帖子?
由于
答案 0 :(得分:0)
如果您对文档建立索引(许多键/值对而不是值),则必须完全针对查询搜索该文档以使用索引。 (例如,如果您只知道名称,日期,autor但不知道主题,则不会使用索引)。这确实限制了你案件的实用性。
更好的选择是创建复合索引。例如:
db.posts.ensureIndex({ posts.date : 1, posts.topic : 1, posts.author : 1});
有了这个,你可以有效地搜索:
按日期发布的帖子,或者
按日期和主题发布的帖子,或者
按日期,主题和作者发布的帖子
见http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes
答案 1 :(得分:0)
@ Z5h,我想你误解了这个问题。 问题是在日期范围之间获取特定组的帖子。 并最有效地存储它们。
经过一番思考和研究后,这才是我发现的。首先,文档大小有限制(目前为16MB),随着帖子架构/帖子的大小增加,随着帖子数量的增加,这可能停止缩放。你不能在子文档数组中添加索引来搜索,因为索引只能跨集合。
其次,如果帖子存储为嵌入式子文档,则无法在帖子中搜索日期范围内的组。我必须获得整个post数组并在客户端进行处理效率低下。到目前为止,无法基于子文档中的字段比较数组对象。参考this
因此,更好的方法是创建单独的帖子集合,并拥有foll数据
posts{
group_name : objectID(<ID in groups collection>),
date : "",
author : "",
topic : ""
}
通过这种方式,我还可以在日期创建索引,并更有效地获取日期范围内的组的所有数据。