我正在为我的组织构建一个基于Web的系统,使用Mongo DB,我已经浏览了mongo db提供的文档并得出以下结论:
find: Cannot pull data from sub array.
group: Cannot work in sharded environment.
aggregate:Best for sub arrays, but has performance issue when data set is large.
Map Reduce : Too risky to write map and reduce function.
因此,如果有人可以帮助我使用子阵列文档的最佳方法,那么在具有分片群集的生产环境中。
示例:
{"testdata":{"studdet":[{"id","name":"xxxx","marks",80}.....]}}
现在我的“studdet”是每个文档超过1000行的大集合,
假设我的查询是:
"Find all the "name" from "studdet" where marks is greater than 80"
它肯定会成为一个聚合查询,所以在这种情况下使用聚合是否可行,因为“find”不能这样做,“group”在分片环境中不起作用,所以如果我去聚合什么会是性能影响,我需要在大多数时间调用此查询。
答案 0 :(得分:0)
请看看: http://docs.mongodb.org/manual/core/data-modeling/ 和 http://docs.mongodb.org/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/#data-modeling-example-one-to-many
这些文档描述了在MongoDB中创建良好文档模式的决策。这是MongoDB中最难做的事情之一,也是最重要的事情之一。它会影响你的表现等。
在您的情况下,运行具有学生集合并具有成绩数组的数据库看起来是最好的选择。
{_id:,...,等级:[{type:“test”,等级:80},...。]}
通常,并且,根据您的示例数据集,聚合框架是最佳选择。在大多数情况下,聚合框架比map reduce更快(当然在执行速度方面,它是C ++ vs javascript for map reduce)。
如果您的数据的工作集变得如此之大,则必须进行分片然后聚合,而其他所有内容都会变慢。但是,然而,将所有内容放在具有大量页面错误的单个计算机上的速度要慢一些。通常,您需要一个比现代计算机上可用RAM更大的工作集,以便分片成为正确的方式,以便您可以将所有内容保存在RAM中。 (此时Mongo提供的商业支持合同将不再是硬件成本,而是包括对架构设计的广泛帮助。)
如果您还需要其他任何内容,请随时提出。
最佳, 查理