Post List

2015년 9월 18일 금요일

MongoDB Study #26 MongoDB C# 연동하기 part 2 정형화된 document 다루기 (insert, update, remove, find)

* 정형화된 Document 란 ? (structured document)

RDBMS에서 Data를 입력하기 위해서 table을 정의합니다.
table 안에는 column 정보가 있죠.
예를 들어서 회원정보라면 id, name, password, addr, tel 등의 정보가 있습니다.
이러한 column 정보들을 미리 정의해 놓아야만 table 생성이 가능합니다.
이렇듯 해당 data에 대해서 어떠어떠한 값이 필요하다라고 정의되어 있는 것을 정형 데이터라고 합니다.
MongoDB에서는 각각의 record를 document 라는 용어로 부르는 관계로 미리 정의해 놓은 field 값들을 class로 만든 뒤 해당 class를 이용해서 MongoDB의 collection을 제어하는 것을 정형화된 document라고 부르기로 합시다.
(합시다 ? 네. 정식용어는 아닙니다. 그냥 제가 그렇게 부르기로 한다는 것이구요.)

* 정형화 document 정의하기

_id와 name 값을 가지는 정형 document를 class로 정의하겠습니다.

public class Member
{
    public ObjectId Id { getset; }
    public string Name { getset; }
}

* collection 객체 선언

MongoCollection<class타입> 을 이용하여 collection을 선언합니다.
(일단 예제라서 명시적으로 타입을 선언했지 대부분의 경우 그냥 var로 선언합니다.)
MongoDB에 접속하는 방법은 이전 posting에서 다뤘으니 설명은 생략하겠습니다.

string connectionString = "mongodb://localhost";
MongoClient client = new MongoClient(connectionString);
MongoServer server = client.GetServer();
MongoDatabase database = server.GetDatabase("test");

// Member Collection
MongoCollection<Member> collection = database.GetCollection<Member>("member");

* Insert

collection.Insert(class 객체) 메서드를 이용하면 됩니다.

// Insert
Member e1 = new Member { Name = "Luna" };
collection.Insert(e1);
ObjectId id = e1.Id;

collection.Save(class 객체) 메서드로도 가능합니다.

// Save
Member e3 = new Member { Name = "Star" };
collection.Save(e3);

.Insert() .Save() 의 차이는 앞서 MongoDB 관련 posting에서 다뤘지만 짧게 다시 설명드리자면,
insert 작업시는 별 차이가 없으며,
save 는 document 단위의 insert, update 작업을 수행하며,
update 는 field 단위의 update 작업을 수행합니다.
사용하는 경우에 따라 성능의 차이가 있습니다.
document 전체값을 수정하는 경우에는 save가 효율적이고,
특정 field들만 수정하는 경우에는 update가 효율적 입니다.

* Find , FindOne, FindAll

Find() FindOne() 은 매개변수로 IMongoQuery 객체를 전달하여 특정 조건에 맞는 document를 찾을 수 있습니다.
query 객체를 만드는 방법은 예제를 참고하세요.
.EQ() , .GT() 등의 메서드로 구현되어 있으며, 조건이 여러개인 경우에는 .AND() , .OR() 메서드에 매개변수로 query 객체 2개를 전달하는 식으로 구현되어 있습니다.
2개 이상인 조건은 다음 posting 인 비정형 document 편에서 소개해드리겠습니다.
FindAll() 은 모든 document를 다 가져옵니다.

// FindOne
IMongoQuery query = Query<Member>.EQ(e => e.Id, id);
Member e2 = collection.FindOne(query);

// FindAll
MongoCursor<Member> cursor = collection.FindAll();
List<Member> L = cursor.ToList<Member>();
foreach (Member e in L)
{
    Console.WriteLine(string.Format("{0} : {1}", e.Id, e.Name));
}

기존에 RDBMS를 다룬 분들이 보기에는 좀 불편해 보일 수 있습니다.
왜 DataSet 이나 DataTable로 가져오지 않고 List로 가져와서 하나하나 제어해야하는지요.
저도 그게 불편해서 그냥 DataTable로 제어 가능하도록 라이브러리를 만들어볼까 생각을 했었지만, MongoDB는 비정형 data를 저장 할 수 있는 구조이므로 별 의미가 없겠다는 생각이 들었습니다.

* Update, Remove

앞서 본 FindOne() 의 경우와 같이 query 개체를 사용해서 특정 조건의 document 들만 수정 및 삭제가 가능합니다.

// Update
UpdateBuilder<Member> update = Update<Member>.Set(e => e.Name, "Silver");
collection.Update(query, update);

// Remove
collection.Remove(query);

* 전체 예제

댓글 없음:

댓글 쓰기