MongoDB中的索引 - 这是更好的方法

时间:2012-01-27 17:43:17

标签: mongodb indexing

我有一个关于在MongoDB中设计索引的问题。

假设我有一个用户集合和组集合。

user {
name : "" ,
age :  19
}

group {
name : ""
members : [],
posts :  [ { date : "" , author : "" , topic : "" }, { date : "" ,
author : "" , topic : "" } ......]
}

可以有1000个群组,每个群体可以拥有数百万个群组 帖子。我经常执行的操作是:

  1. 根据日期获取帖子(70%)
  2. 更新帖子(30%)
  3. 所以,基本上我需要在日期上编制索引。

    我的问题是:

    我应该创建像

    这样的新帖子集合吗?
    posts {
    name : "",  date : "" , author : "" , topic : ""
    }
    

    并在帖子集合中创建一个单值索引

    ( db.posts.ensureIndex({posts : 1}) )
    

    我应该在组对象中包含帖子并创建嵌入式 索引如db.groups.ensureIndex({ posts.date : 1})

    哪一个效率更高?如果需要,最好的做法是什么? 扩展到数百万个帖子?

    由于

2 个答案:

答案 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 : "" 
    }
    

通过这种方式,我还可以在日期创建索引,并更有效地获取日期范围内的组的所有数据。