MongoDB中的索引-哪种方法更好

MongoDB中的索引-哪种方法更好,mongodb,indexing,Mongodb,Indexing,我有一个关于在MongoDB中设计索引的问题 假设我有一个用户集合和组集合 user { name : "" , age : 19 } group { name : "" members : [], posts : [ { date : "" , author : "" , topic : "" }, { date : "" , author : "" , topic : "" } ......] } 可以有1000个组,每个组可以有数百万个 帖子。我经常执行的操作是: 获得基于日期的帖

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

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

user {
name : "" ,
age :  19
}

group {
name : ""
members : [],
posts :  [ { date : "" , author : "" , topic : "" }, { date : "" ,
author : "" , topic : "" } ......]
}
可以有1000个组,每个组可以有数百万个 帖子。我经常执行的操作是:

获得基于日期的帖子70% 更新帖子30% 所以,基本上我需要在日期上建立索引

我的问题是:

我应该创建一个新的posts集合吗

posts {
name : "",  date : "" , author : "" , topic : ""
}
并在posts集合中创建一个日期值索引

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

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

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


谢谢

如果您在文档上索引了许多键/值对,而不是一个值,那么您必须准确地搜索该文档,以便查询使用索引。e、 如果你只知道名字,日期,自动但不知道主题,那么索引将不会被使用。这确实限制了您的案例的实用性

更好的选择是创建复合索引。例如: db.posts.ensureIndex{posts.date:1,posts.topic:1,posts.author:1}; 有了它,您可以高效地搜索: 按日期发布,或 按日期和主题发布,或 按日期、主题和作者发布。

@Z5h,我想你误解了这个问题。 问题是在日期范围内获取特定组的帖子。 并最有效地存储它们

经过一些思考和研究,我发现了这一点

首先,目前文档的大小有16MB的限制,随着post架构/post大小的增加,这可能会随着post数量的增加而停止扩展。并且u不能在子文档数组中添加索引进行搜索,因为索引仅跨集合

其次,如果帖子存储为嵌入子文档,则无法在帖子中搜索日期范围内的组。我必须得到整个posts数组,并在客户端进行处理,这是低效的。目前无法根据子文档中的字段比较数组对象。提及

因此,更好的方法是创建一个单独的posts集合,并拥有foll数据

posts{
group_name : objectID(<ID in groups collection>),
date : "",
author : "",
topic : "" 
}
通过这种方式,我还可以创建日期索引,更有效地获取日期范围内组的所有数据