MongoDB集合结构性能
我有一个由半复杂记录组成的MongoDB数据库,随着集合大小的增加,我的报告查询也变得困难重重。我想制作一些优化的报告视图,以便快速搜索和聚合。以下是一个示例格式:MongoDB集合结构性能,mongodb,data-structures,aggregation-framework,reporting,database,Mongodb,Data Structures,Aggregation Framework,Reporting,Database,我有一个由半复杂记录组成的MongoDB数据库,随着集合大小的增加,我的报告查询也变得困难重重。我想制作一些优化的报告视图,以便快速搜索和聚合。以下是一个示例格式: var record = { fieldOne:"", fieldTwo:"", fieldThree:"", //There is approx 30 fields at this level ArrayOne:[ {subItem1:""}, {subItem2:""} // There are usually
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
]}
]
};
我曾经在ArrayTwo
位于ArrayOne
项中,而arraytree
位于ArrayTwo
项中的情况下使用此数据,因此暗示了引用父级,但报告成为了一场具有多个嵌套级别数组的噩梦
我在每个级别都有一个名为“fieldName”的字段,这是我们在数组中定位对象的一种方式
在一个查询中,我通常需要将来自3个数组中任意一个数组的值聚合到数千条记录中
我看到两种方法
A) 。展平并垂直移动,在数据库中为阵列树中的每个项目创建一个较小的记录,基本上每个复杂记录添加200条记录。我试过了,在5天的新数据输入中,我已经有了20万条记录。这样做的好处是,我可以在字段名上建立索引
B) 。水平展平,使每个阵列都在单个采集记录内展平。我将使用每个数组对象中的字段名作为键
。这将生成一个包含200-300个字段的记录。这将使集合中的记录大大减少,但字段将是动态的,因此不可能添加索引(据我所知)
目前,我有大约30万条现有记录,我将根据这些记录构建此视图。如果我垂直放置,将在数据库中放置6000万条简单记录,如果我水平放置,将是300K条记录,每个记录中有200个字段,没有索引功能
正确的方法是什么?我倾向于坚持mongo哲学,为每个不同的信息集/信息块单独输入,而不是依赖于一个奇怪的复合对象中的引用
6000万张唱片是“很多”(但它实际上不是“一吨”),mongodb喜欢有很多小东西扔给它。另一方面,你最终会得到更少的大对象,并占用同样多的空间
(*使用带压缩的wired tiger后端将使您的磁盘走得更远)
**编辑:
我还要补充一点,你真的很想在一天结束时得到索引,所以这是对这种方法的又一次投票