몽고DB의 도큐먼트 데이터 모델은 가변적인 속성을 갖는 데이터를 표현하는데 유용하다.

가령, 상품(product)의 경우 상품 속성이 달라질수 있다.

{
	_id: ObjectId("xxx"),
	type: "Laptop",
	attrs: {
		color: "silver",
		weight: 0.5
	}
}
{
	_id: ObjectId("yyy"),
	type: "Keyboard",
	attrs: {
		keys: 108,
		layout: "en"
	}
}

위와 같이 attrs 속성이 가변적이고, 이 필드 조건에 대해 자주 질의를 한다면 인덱스를 생성해야한다. 이때 희소(sparse) 인덱스를 생성하면 좋다.

8.2.1 인덱스 타입

db.products.createIndex({ "attrs.color": 1, "attrs.weight" }, { sparse: true })

희소 인덱스를 사용하므로써, 효율성을 높힐 수 있다.

만약, 어플리케이션이 전혀 예측 할수 없는 가변 속성이라면, 각각에 대해 별도의 인덱스를 구축하기 어려울 수 있는데, 그럴 경우, 키-값(Key-Value) 쌍의 배열을 고려해볼 수 있다.

단, 이 방법의 경우, 인덱스의 키의 이름을 저장하게 되므로 인덱스 오버헤드가 상당히 크다.

{
	_id: ObjectId("xxx"),
	type: "Laptop",
	attrs: [
		{ k: "color", v: "silver" },
		{ k: "weight", v: : 0.5 }
	]
}
db.products.createIndex({ "attrs.k": 1, "attrs.v" })

조회는 다음과 같이 할 수 있다.

db.products.find({
	"attrs": {
		"$elemMatch": { k: "color", v: "silver" }
	}
})