MongoDB 数组在mongodb 中存在的意义

本文探讨了MongoDB中数组和嵌套结构在文档设计中的应用。通过比较两种不同的数据存储方式——数组与键值对,分析了它们在查询效率、统计分析和数据更新上的差异。数组设计在某些查询场景下能简化操作,但频繁更新可能导致性能问题。文章还提到了数组索引的创建和查询优化,以及如何利用数组进行数据统计。总结了数组在MongoDB中的优势和挑战,为数据库设计提供了参考。
摘要由CSDN通过智能技术生成

e42032c000e1a1cbabb080147536fb39.png

在MOGNODB 的文档设计和存储中,存在两个部分 1  嵌套  2 数组,所以如果想设计好一个MONGODB 在理解业务,读写比例,查询方式后,就需要介入到更深层次的理解嵌套的查询方式,嵌套多层后的性能问题, 数组其实比嵌套带来更多的问题,所以今天我们的从数组开始。

MONGODB 中的数组是属于同类型数据的元素集合,每个数组中的元素代表这个数组中同样属性的不同值,其实我们可以理解为,在一个JSON 中,有行和行列集合的存在,本身JSON可以通过数组的方式,在一个平面里面表达一个列的集合。

下面我们操作插入多条记录,其中包含了一个以 score 为主的分数的数组,其中包含每个数据库的分数

db.databases.insertMany([
    { system_name: "oracle", b_time: 1975, score: [90,70,55] },
    { system_name: "mysql", b_time: 1990, score: [100,60,55]},
    { system_name: "postgresql", b_time: 1978, score: [100,80,65] },
    { system_name: "sql server", b_time: 1980, score: [60,45,25] },  
    { system_name: "mongodb", b_time: 2001, score: [100,90,55]}
]);

cd4f568477f2d2f5987382aa63a9d09b.png

实际上我们也可以将上方的记录设计成


db.databases1.insertMany([
    { system_name: "oracle", b_time: 1975, score1: 90, score2:80,score3:75 },
    { system_name: "mysql", b_time: 1990, score1: 100, score2:70,score3:55},
    { system_name: "postgresql", b_time: 1978, score1: 100, score2:80,score3:75 },
    { system_name: "sql server", b_time: 1980, score1: 60, score2:55,score3:45 },  
    { system_name: "mongodb", b_time: 2001, score1: 100, score2:7,score3:65}
]);

e429de683d6bc1a89723230e9ec7df9d.png

上方有的两个设计都已经将数据库的打分记录了,一种是以数组的方式,一种是以键值对的方式进行记录。

那么我们看看这样的设计不同对于后续的使用有什么不同

1   进行查询

我们要查询整体每种数据库的打分的个数,也就是我们看看每个数据库有多少的打分。相当于对每个ducument 中的数据进行元素的计算,这样就可以得到每个数据库的被打分的个数, 而第二组设计则无法进行分析的和统计。

db.databases.aggregate([{$project: { count: { $size:"$score" }}}]) ,

这里的project 是控制聚合后显示的列,这里我们通过 $size 匹配所有的score中数组的元素,并进行count ,然后进行聚合操作,并通过project进行投射的工作,最终显示出下图的内容,每行score的元素个数。

005f7c6b40b6f558c3b8ce2bca5666a1.png

而上面不通过数组进行的document的设计方式,则很难进行相关的统计分析操作。

我们对数组建立索引,db.databases.createIndex({score:1})

ff9ae9c3c40485f4551a620836c25612.png

现在我们要找出每个数据库中打分高于90的数据

db.databases.find({score:{$gt:90}},{system_name:1,"_id":0}

13d70888ab26d283064429f9d9ac94d6.png

9a1b91de4e5e281c01a15af5c722c795.png

而没有使用数组的设计的方式,则需要对每一个score1 score2 score3 分别进行查询,并将结果合并后去重后,才能得到相应的结果。

同时为了保证查询的速度需要对score1, score2,  score3  分别建立索引并,这样索引占用的空间也比上一种方式要大。

22ed7b93614f41d04e8497f8b481f165.png

b8d21557f55a88bc3faf895bf5f98afd.png

可以比对两种设计模式中,使用数组的方式建立的多键值索引对比分开的索引容量缩减了60%。

数组在一部分应用设计中适合进行数据查询,而另外一点就是数组的缺点,就是对数组中的数据进行更新,尤其是高频次,大量的数据更新和数据的添加。

下面就是针对ORACLE 添加在数组中添加一个数据元素。

db.databases.update({system_name:"oracle"},{$push:{"score":30}})

696d525c8dc38a910ecda942288253ec.png

83acef4696f0aac8c29826884ce5595c.png

对数据进行更新,将刚才的加入的数组元素进行修改db.databases.update({system_name:"oracle"},{$set:{"score.4":50}})

ccbbe8a975ea89465a7f346588f86a27.png

591e915b2e1e3ff46ad84e582e792144.png

231caa2d44a8cce41e64bf1fcff3abd5.png

另外对于数组的另外一个功能,就是将一些设计中的行转换在MONGODB的数组方式,类似于行转列的方式设计。

数组在MONGODB 中存在的意义很大,在很多设计中都可以通过数组的使用降低查询的复杂度和降低建立索引的SIZE。

ef1ced23f7400c08af7f6f59432fc910.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值