我有一个包含半复杂记录的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项中,ArrayThree在ArrayTwo项中,因此隐含着引用父项,但是由于有多个嵌套级别的数组,报告成了一场噩梦。
我在每个级别都有一个名为'fieldName‘的字段,这是我们在数组中定位对象的一种方式。
我经常需要聚合查询中数千条记录中3个数组中的任何一个数组的值。
我认为有两种方法可以做到。
a)。展平并垂直移动,为ArrayThree中的每个项目在数据库中创建一个较小的记录,实质上是为每个复杂记录添加200条记录。我试过了,在5天的新数据输入中,我已经有了200K条记录。这样做的好处是我有了fieldNames,我可以在上面建立索引。
b)。水平展平,使每个数组都展平在单个集合记录中。我将使用位于每个数组对象中的FieldName作为key。这将创建一个包含200-300个字段的记录。这将大大减少集合中的记录,但字段将是动态的,因此添加索引是不可能的(据我所知)。
目前,我有大约300K的现有记录,我将在此基础上构建此视图。如果我进行垂直操作,将会在数据库中放置6000万条简单记录,而如果我进行水平操作,将会有300K条记录,每个记录中有200个字段,没有索引能力。
解决这个问题的正确方法是什么?
发布于 2016-03-31 07:06:43
我倾向于坚持mongo哲学,为每一组不同的信息单独输入,而不是依赖于奇怪的复合对象中的引用。
6000万条记录是“很多”(但它真的不是“一吨”),mongodb喜欢有很多小东西扔在它上面。另一方面,你最终会得到更少的大物体,并占用同样多的空间。
(*使用有线tiger后端与压缩将使您的磁盘更进一步)。
**编辑:我还想补充说,你最终确实想要索引,所以这是对这种方法的另一种投票。
https://stackoverflow.com/questions/36018035
复制相似问题