在mongodb中包含数组,数组在MONGODB 的使用中是一个比较方便的存在,如我们去处理处理一个数组的事例
代码语言:javascript复制db.articles.insert([
{
"_id" : 1,
"description" : "DESCRIPTION ARTICLE AB",
"article_code" : "AB",
"purchase" : [
{
"company" : 1,
"cost" : NumberDecimal("80.010000")
},
{
"company" : 2,
"cost" : NumberDecimal("85.820000")
},
{
"company" : 3,
"cost" : NumberDecimal("79.910000")
}
],
"stock" : [
{
"country" : "01",
"warehouse" : {
"code" : "02",
"units" : 10
}
},
{
"country" : "02",
"warehouse" : {
"code" : "02",
"units" : 8
}
}
]
},
{
"_id" : 2,
"description" : "DESCRIPTION ARTICLE AC",
"article_code" : "AC",
"purchase" : [
{
"company" : 1,
"cost" : NumberDecimal("90.010000")
},
{
"company" : 2,
"cost" : NumberDecimal("95.820000")
},
{
"company" : 3,
"cost" : NumberDecimal("89.910000")
}
],
"stock" : [
{
"country" : "01",
"warehouse" : {
"code" : "01",
"units" : 20
}
},
{
"country" : "02",
"warehouse" : {
"code" : "02",
"units" : 28
}
}
]
}
]);
这是一个很典型的例子,其中大量的使用了数组,并在数组中有多个元素,在MONGODB 4.x 之后针对数组的查询,产出了$elemMatch的查询的方式,具体查询的方式为
fieldName: { $elemMatch: {条件,条件}}
在不添加索引的情况下,查询走的是全表的扫描
在添加了索引后,我们在查询,可以通过索引来进行数据的查询。
那么对于数组中的元素的查询,需要单独建立数组内的元素的索引,而不能只建立外部field的索引。所以如果针对数组中的多个元素进行数据查询,则需要建立多个索引,这是问题 1.
同时另外一个问题是基于数组的更新的问题,尤其是针对数组内的元素的增长过多的情况下,同时还伴随着数组的内的元素的数量较多的情况下,会产生两个问题。
1 数组内的元素添加后,会造成整体基于数组的索引进行物理的数据的重排,造成数组在磁盘上的数据进行重组,导致I/O消耗。如果数组中的元素过多,甚至会产生重建索引的效果。这里不光是数组元素的添加,数组元素的消减也是会产生类似的效果。
2 如果因为防止数组元素增加,造成上面的效果,而不建立索引,则会出现查询全表扫描的问题,导致查询速度无法接受
3 使用者如果没有专业的MOGNODB的查询知识,没有使用elemMatch的查询方式或者版本的问题,并没有使用MONGODB4.0及以上的版本,这关于数组元素的查询都是一个灾难,在一定数据量级的情况下,产生数据查询的性能问题。