Post List

2015년 9월 18일 금요일

MongoDB Study #27 MongoDB C# 연동하기 part 3 비정형 document 다루기 (insert, update, remove, find)

* 비정형 document 란 ? (unstructured document)

RDBMS에서는 한 table 내의 모든 record 들의 column은 동일합니다.
MongoDB에서는 document 들의 field가 미리 정의되어 있지 않을 뿐더러
동일 collection 내의 document 들의 field들이 서로 다를 수 있습니다.
이런 것을 비정형 data라고 합니다.

앞의 posting에서 정형 data에 대해서는 미리 field 정의와 동일한 형태의 class를 생성 한 뒤 document를 해당 class의 객체로 선언하여 사용하였습니다.

* BsonDocument

비정형 document에서는 정형 document같이 class를 미리 선언 할 수가 없습니다.
그래서 BsonDocument 객체를 이용해서 data를 입출력합니다.
BsonDocument 객체는 key : value 의 pair 들을 포함하는 collection 이라고 생각하면 이해가 쉽게 될것입니다.
value 로는 string, int 등의 값 뿐만 아니라 배열, BsonDocument 도 가능합니다.

BsonDocument에 대한 member 및 method 들의 대한 자세한 정보는 API reference를 참조하시면 됩니다.

http://api.mongodb.org/csharp/1.0/html/3a31e174-4df4-91f3-6760-02078b53ddb1.htm

* 접속, 예제 Collection 및 FindAll

접속 및 collection 선언은 앞서 다룬 내용이라 생략하겠습니다.
그리고, 이번 posting에서는 타입 선언을 명시적으로 하지않고 그냥 var로 선언하겠습니다.
비정형 document에 대한 결과를 .ToList() 로 가져오면 List<BsonDocument> 형태로 저장됩니다. BsonDocument를 string 형태로 출력하려면 .ToJson()을 이용하면 됩니다.

var database = new MongoClient("mongodb://localhost").GetServer().GetDatabase("test");

// emp Collection
var emp = database.GetCollection("emp");
var cEmp = emp.FindAll();
var lstEmp = cEmp.ToList();
foreach (var e in lstEmp)
{
    Console.WriteLine(string.Format("{0}", e.ToJson()));
}

미리 만들어놓은 emp collection에는 다음의 정보가 들어 있었습니다.

* Insert

BsonDocument를 하나 생성하여 .Insert() 메서드를 이용하면 됩니다.

var luna = new BsonDocument { { "name""Luna" }, { "age"19 } };
emp.Insert(luna);

* FindOne , query 생성

luna 를 BsonDocument로 선언했을 때는 name 과 age 에 대한 field만 생성하였지만,
insert 작업 후에는 _id 라는 field로 생성되었습니다.
BsonDocument 내의 특정 field 값을 가져오는 메서드는 .GetValue(필드명) 입니다.
.FindOne(query 객체) 를 사용하면 해당 조건에 맞는 document 1개만을 가져옵니다.

var queryLuna = Query.EQ("_id", luna.GetValue("_id"));
var luna2 = emp.FindOne(queryLuna);

Console.WriteLine("Luna : {0}", emp.FindOne(queryLuna).ToJson());

* Update

.Update() 메서드에 query 객체와 UpdateBuilder 객체를 전달하여 수행하면 됩니다.

emp.Update(queryLuna, Update.Set("age"27));

Console.WriteLine("Luna : {0}", emp.FindOne(queryLuna).ToJson());

* Remove

설명이 필요 없을듯 합니다. 예제를 보시면 이해가 가능하실 겁니다.

var queryLuna2 = Query.EQ("name""Luna");
emp.Remove(queryLuna2);

var rl = emp.FindOne(queryLuna2);
if (rl == null)
    Console.WriteLine("Luna isn't exist");
else
    Console.WriteLine("Luna : {0}", rl.ToJson());

* Find , query 조건 여러개

.Find() 메서드의 사용도 앞서 배운 정형 document와 별로 다르지 않습니다.
query 조건이 1개 이상인 경우에는 Query.AND() 또는 Query.OR() 메서드에 query 객체들을 전달하는 식으로 구현이 가능합니다.

Console.WriteLine("");
Console.WriteLine("sal > 2000");
Console.WriteLine("");

foreach (var e in emp.Find(Query.GT("sal"2000)).ToList())
{
    Console.WriteLine(string.Format("{0}", e.ToJson()));
}

Console.WriteLine("");
Console.WriteLine("sal > 2000 and deptno = 20");
Console.WriteLine("");

var multiQuery = Query.And(Query.GTE("sal"2000), Query.EQ("deptno"20));
foreach(var e in emp.Find(multiQuery).ToList())
{
    Console.WriteLine(string.Format("{0}", e.ToJson()));
}

* 예제 코드


* 실행 결과


댓글 없음:

댓글 쓰기