gpt4 book ai didi

MongoDB 集合结构性能

转载 作者:可可西里 更新时间:2023-11-01 09:54:54 31 4
gpt4 key购买 nike

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

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 个数组中任何一个的值。

我看到了两种方法。

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

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

目前,我有大约 30 万条现有记录,我将根据这些记录构建此 View 。如果我是垂直的,那将在数据库中放置 6000 万条简单记录,如果我是水平的,那将是 30 万条记录,每条记录有 200 个扁平化的字段,没有索引能力。

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

最佳答案

我倾向于坚持 mongo 哲学并为每个不同的信息集/片段做单独的条目,而不是依赖一个奇怪的复合对象中的引用。

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

(*使用带压缩的有线老虎后端也会使您的磁盘走得更远)。

**编辑:我还要补充一点,你真的真的真的想要在一天结束时使用索引,所以这是对这种方法的另一种投票。

关于MongoDB 集合结构性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36018035/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com