首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB集合结构性能

MongoDB集合结构性能
EN

Stack Overflow用户
提问于 2016-03-16 01:22:27
回答 1查看 130关注 0票数 3

我有一个包含半复杂记录的MongoDB数据库,随着集合大小的增加,我的报告查询非常困难。我想制作一些针对快速搜索和聚合进行优化的报告视图。下面是一个示例格式:

代码语言:javascript
复制
var record = {
fieldOne:"",
fieldTwo:"",
fieldThree:"", //There is approx 30 fields at this level
ArrayOne:[
    {subItem1:""},
    {subItem2:""} // There are usually about 10-15 items in this array
],
ArrayTwo:[
    {subItem1:""}, //ArrayTwo items reference ArrayOne item ids for ref
    {subItem2:""} // There are usually about 20-30 items in this array
],
ArrayThree:[
    {subItem1:""},// ArrayThree items reference both ArrayOne and ArrayTwo items for ref
    {subItem2:""},// There are usually about 200-300 items in this array
    {subArray:[
        {subItem1:""},
        {subItem2:""} // There are usually about 5 items in this array
    ]} 
]
};

我曾经有过这样的数据,其中ArrayTwoArrayOne项中,ArrayThreeArrayTwo项中,因此隐含着引用父项,但是由于有多个嵌套级别的数组,报告成了一场噩梦。

我在每个级别都有一个名为'fieldName‘的字段,这是我们在数组中定位对象的一种方式。

我经常需要聚合查询中数千条记录中3个数组中的任何一个数组的值。

我认为有两种方法可以做到。

a)。展平并垂直移动,为ArrayThree中的每个项目在数据库中创建一个较小的记录,实质上是为每个复杂记录添加200条记录。我试过了,在5天的新数据输入中,我已经有了200K条记录。这样做的好处是我有了fieldNames,我可以在上面建立索引。

b)。水平展平,使每个数组都展平在单个集合记录中。我将使用位于每个数组对象中的FieldName作为key。这将创建一个包含200-300个字段的记录。这将大大减少集合中的记录,但字段将是动态的,因此添加索引是不可能的(据我所知)。

目前,我有大约300K的现有记录,我将在此基础上构建此视图。如果我进行垂直操作,将会在数据库中放置6000万条简单记录,而如果我进行水平操作,将会有300K条记录,每个记录中有200个字段,没有索引能力。

解决这个问题的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2016-03-31 07:06:43

我倾向于坚持mongo哲学,为每一组不同的信息单独输入,而不是依赖于奇怪的复合对象中的引用。

6000万条记录是“很多”(但它真的不是“一吨”),mongodb喜欢有很多小东西扔在它上面。另一方面,你最终会得到更少的大物体,并占用同样多的空间。

(*使用有线tiger后端与压缩将使您的磁盘更进一步)。

**编辑:我还想补充说,你最终确实想要索引,所以这是对这种方法的另一种投票。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36018035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档