存储嵌入式注释与避免MongoDB中的开销

时间:2010-07-30 15:46:15

标签: mongodb normalization denormalization nosql

让我解释一下我的问题,希望有人可以提供一些好的建议。

我目前正在开发一个网络应用程序,用于存储大量应用程序的信息和元数据。对于每个应用程序,可能存在与应用程序和应用程序版本ID相关联的10到100个注释。我使用MongoDB是因为需要简单的未来可扩展性和速度。我已经读过,出于读取性能的原因,应该将注释嵌入到集合中,但我不确定这是否适用于我的情况。我在另一篇文章中读到:

通常,如果您需要自己使用给定的数据集,请将其设置为集合。
由:@kb

在我的情况下,我不需要自己处理这个集合。让我进一步解释。我将有一个应用程序表(可以过滤),并在您通过应用列表滚动或过滤时动态加载条目。如果我将注释嵌入到应用程序集合中,那么当我将应用程序条目动态加载到表中时,我将发送所有注释。但是,我想做“延迟加载”,因为我只想在用户请求查看它们时加载注释(通过单击表中的条目)。

例如,我的表格可能如下所示

| app name | version | rating | etc. | view comments |
------------------------------------------------------
| app1     | v.1.0   | 4 star | etc. | click me!     |
| app2     | v.2.4.5 | 3 star | etc. | click me!     |
| ...

我的问题是什么会更有效率?在MongoDB上读取的速度是否足够快,我在每个应用程序中提取所有注释并不重要?如果用户没有过滤任何应用程序并一直滚动到底部,他们可能会加载125k到250k条目/应用程序。

1 个答案:

答案 0 :(得分:2)

我建议您更具体地考虑您的查询 - 您指定要返回的对象的哪些部分。当您只想显示有关应用程序的一些特定信息时,这应该可以避免获得大量嵌入式注释的开销。

您可以执行以下操作:db.collection.find({ appName : 'Foo'}, {comments : 0 });appName Foo检索应用程序对象,但明确排除嵌入其中的comments对象(更可能是对象数组)。

来自MongoDB docs

  

检索字段子集   默认情况下,在查找操作上,将返回整个文档/对象。但是,我们也可能要求仅返回某些字段。请注意,_id字段始终自动返回。

// select z from things where x=3
db.things.find( { x : 3 }, { z : 1 } );
  

您还可以删除您知道的大字段:

// get all posts about mongodb without comments
db.posts.find( { tags : 'mongodb' }, { comments : 0 } );

修改 另请记住limit(n)功能,一次只能检索n个应用。例如,在没有评论的情况下获取n=50个应用将是:

db.collection.find({}, {comments : 0 }).limit(50);