Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB集合结构性能_Mongodb_Data Structures_Aggregation Framework_Reporting_Database - Fatal编程技术网

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

我有一个由半复杂记录组成的MongoDB数据库,随着集合大小的增加,我的报告查询也变得困难重重。我想制作一些优化的报告视图,以便快速搜索和聚合。以下是一个示例格式:

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后端将使您的磁盘走得更远)

**编辑: 我还要补充一点,你真的很想在一天结束时得到索引,所以这是对这种方法的又一次投票