Mongodb 数组使用的注意事项

2022-04-05 14:33:56 浏览数 (1)

在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及以上的版本,这关于数组元素的查询都是一个灾难,在一定数据量级的情况下,产生数据查询的性能问题。

0 人点赞