spring boot(1.3.0)를 이용해서 mongodb(mongo 3.0.6)를 사용하고 있다. 

mongo 터미널을 이용해서 mongodb에서 색인 추가/삭제하는 법을 알고, jpa 연동시 주의사항을 본다.



1. mongodb에서 색인 추가/삭제하기



* 참고 자료 : http://docs.mongodb.org/manual/core/index-creation/


customer 콜렉션에 색인 추가하기

 

replset:PRIMARY> use test

switched to db test

replset:PRIMARY> db.customer.save({id:1, firstName:'samuel', lastName:'kim'})

WriteResult({ "nInserted" : 1 })

replset:PRIMARY> db.customer.save({id:2, firstName:'daniel', lastName:'park'})

WriteResult({ "nInserted" : 1 })

replset:PRIMARY> db.customer.ensureIndex({firstName:1})

{

"createdCollectionAutomatically" : false,

"numIndexesBefore" : 1,

"numIndexesAfter" : 2,

"ok" : 1

}

replset:PRIMARY> db.customer.indexes.find()

replset:PRIMARY> db.customer.find()

{ "_id" : ObjectId("5601058d3004b0f26a3fd806"), "_class" : "com.kakao.story.gateway.model.Customer", "firstName" : "Alice", "lastName" : "Smith" }

{ "_id" : ObjectId("5601058d3004b0f26a3fd807"), "_class" : "com.kakao.story.gateway.model.Customer", "firstName" : "Bob", "lastName" : "Smith" }

{ "_id" : ObjectId("561635bdc95ab6bd4d165508"), "id" : 1, "firstName" : "samuel", "lastName" : "kim" }

{ "_id" : ObjectId("561635d3c95ab6bd4d165509"), "id" : 2, "firstName" : "daniel", "lastName" : "park" }

replset:PRIMARY> db.customer.getIndexes()

[

{

"v" : 1,

"key" : {

"_id" : 1

},

"name" : "_id_",

"ns" : "test.customer"

},

{

"v" : 1,

"key" : {

"firstName" : 1

},

"name" : "firstName_1",

"ns" : "test.customer"

}

]




customer 콜렉션에 추가했던 색인을 삭제한다.


replset:PRIMARY> db.customer.dropIndex({'firstName':1})

{ "nIndexesWas" : 2, "ok" : 1 }

replset:PRIMARY> db.customer.getIndexes()

[

{

"v" : 1,

"key" : {

"_id" : 1

},

"name" : "_id_",

"ns" : "test.customer"

}

]




2. jpa 모델 연동 사항

Customer라는 클래스를 저장 모델로 하여 JPA로 사용하고 있다고 가정한다.

Customer 클래스에 id를 주어 간단하게 모델로 저장할 때는 아래와 같이 사용할 수 있다. 

public class Customer {

@Id
private String id;

private String firstName;

private String lastName; //... }

문제는 mongodb의 Customer 콜렉션에 새로운 색인을 만들기 위해서 @Indexed를 firstName 필드에 추가하면 색인에 추가되지 않는다.
import org.springframework.data.mongodb.core.index.Indexed;

public class Customer {

@Id
private String id;

@Indexed
private String firstName;

private String lastName; //... }



getIndexes()와 stats()을 호출했을 때 index 상황을 볼 수 있는데, 여전히 색인은 id만 되어 있다.
replset:PRIMARY> db.customer.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "staticmap.customer"
}
]

replset:PRIMARY> db.customer.stats()
...
"nindexes" : 2,
...


@Indexed의 정상 동작을 하도록 하려면, 클래스 앞에 반드시 @Document를 추가해야 한다. 그리고 mongo 터미널에서 확인하면 정상적으로 동작하는지 확인할 수 있다.

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document
public class Customer {

@Id
private String id;

@Indexed
private String firstName;

private String lastName; //... }


replset:PRIMARY> db.customer.getIndexes()

[

{

"v" : 1,

"key" : {

"_id" : 1

},

"name" : "_id_",

"ns" : "staticmap.customer"

},

{

"v" : 1,

"key" : {

"_fts" : "text",

"_ftsx" : 1

},

"name" : "Customer_TextIndex",

"ns" : "staticmap.customer",

"weights" : {

"firstName" : 1

},

"default_language" : "english",

"language_override" : "language",

"textIndexVersion" : 2

}

]


replset:PRIMARY> db.customer.stats()
...
"nindexes" : 2,
...



Posted by '김용환'
,